天天看點

QT總結6-OpenGL初始化

在qt中使用OpenGL時要注意OpenGL初始化的時間,intializeGL函數會在paint之前調用,但是隻調用一次,因為這個函數不是顯示的進行調用,是以我們可能無法确定它初始化的時間,這就給使用OpenGL進行紋理貼圖的時候造成了麻煩。

經過測試發現init不是在調用構造函數之後被調用的,而是在界面需要顯示的時候進行調用。打個比方,有兩個界面需要顯示,OpenGL的界面是第二個界面,目前是第一個界面,你的程式已經建立了第二個界面,并對第二個界面進行了update,此時update不會對OpenGL進行初始化,它進行了重新整理,但是對OpenGL沒有影響,如果此時認為已經初始化,然後進行紋理的設定,那麼紋理設定的代碼就會報錯。

但如果是界面進行切換的時候進行update,那麼函數會先進行init,然後在進行update,這樣代碼是不報錯的。OpenGL的初始化隻有在需要顯示繪圖的時候才會調用。

這應該是QOpenGLWIdget類的一個bug,這個類的update函數無法更新opengl的顯示,隻有當滑鼠點選或者繪圖時才有效果。如果使用QGLWidget的updateGL可以重新整理,但是這個類會導緻許多未知錯誤,(我遇到的是紋理的其中一張變成白色,同時在界面多次切換的時候程式會崩潰)。

繼續閱讀