qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程
在Qt5.4的Example中,有一個例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過程中,需要注意哪些方面呢?我在最初使用的時候就遇到兩者不能同時使用的問題,經過一番折騰,終于解決了該問題。下面,我將需要注意的點記錄下來,以便查詢。
第一種方法,也就是直接QOpenGLWidget的paintGL函數中繪制兩者,其步驟為:
void GLWidget::paintGL() {
QPainter painter;
painter.begin(this);
painter.beginNativePainting();
//繪制3D內容
......
//注意:1、一定要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等;2、如果開啟深度測試,一定要關閉。例如:
m_program->release();
m_vao.release();
m_logoVbo.release();
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
painter.endNativePainting();
//繪制2D內容
......
painter.end();
}
第二種方法,是在網上找的,其貼子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,該貼主應該無法使用第一種方法,所以,另辟蹊徑。現將方法也列出來,便于杳找,如若想詳細了解,請到上面的網址。其步驟為:首先,重載兩個函數paintGL、paintEvent;然后,就是實現,但是這種方法需要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要關閉深度測試。
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
......
}
void GLWidget::paintEvent(QPaintEvent *e)
{
makeCurrent();
paintGL();
QPainter pter(this);
pter.setPen(Qt::blue);
pter.drawText(20,50,"This is a Text!");
pter.end();
update();
}
在第二種方法中,paintGL和paintEvent的調用是一一對應的;起初,我還以為paintGL每次更新,會被調用兩次,經過測試,其只被paintEvent函數調用一次。
兩種方法都有其優點,在根據需要選擇;第二種方法,比較適合擴展,無需改動原因的代碼,只需要重載paintEvent,并在函數中調用paintGL,并繪制2D內容即可。
總結
以上是生活随笔為你收集整理的qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刀圈TD正式版通关攻略
- 下一篇: redis storm mysql_fl