在Qt5.4的Example中,有一個(gè)例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過(guò)程中,需要注意哪些方面呢?我在最初使用的時(shí)候就遇到兩者不能同時(shí)使用的問(wèn)題,經(jīng)過(guò)一番折騰,終于解決了該問(wèn)題。下面,我將需要注意的點(diǎn)記錄下來(lái),以便查詢。 第一種方法,也就是直接QOpenGLWidget的paintGL函數(shù)中繪制兩者,其步驟為: void GLWidget::paintGL() { QPainter painter; //繪制3D內(nèi)容 ...... //注意:1、一定要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等;2、如果開(kāi)啟深度測(cè)試,一定要關(guān)閉。例如: m_program->release(); painter.endNativePainting(); //繪制2D內(nèi)容 ...... painter.end(); } 第二種方法,是在網(wǎng)上找的,其貼子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,該貼主應(yīng)該無(wú)法使用第一種方法,所以,另辟蹊徑?,F(xiàn)將方法也列出來(lái),便于杳找,如若想詳細(xì)了解,請(qǐng)到上面的網(wǎng)址。其步驟為:首先,重載兩個(gè)函數(shù)paintGL、paintEvent;然后,就是實(shí)現(xiàn),但是這種方法需要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要關(guān)閉深度測(cè)試。 void GLWidget::paintGL() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ...... } void GLWidget::paintEvent(QPaintEvent *e) { makeCurrent(); } 在第二種方法中,paintGL和paintEvent的調(diào)用是一一對(duì)應(yīng)的;起初,我還以為paintGL每次更新,會(huì)被調(diào)用兩次,經(jīng)過(guò)測(cè)試,其只被paintEvent函數(shù)調(diào)用一次。 兩種方法都有其優(yōu)點(diǎn),在根據(jù)需要選擇;第二種方法,比較適合擴(kuò)展,無(wú)需改動(dòng)原因的代碼,只需要重載paintEvent,并在函數(shù)中調(diào)用paintGL,并繪制2D內(nèi)容即可。 |
|
來(lái)自: 勤奮不止 > 《界面庫(kù)qt》