qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程
在Qt5.4的Example中,有一個(gè)例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過程中,需要注意哪些方面呢?我在最初使用的時(shí)候就遇到兩者不能同時(shí)使用的問題,經(jīng)過一番折騰,終于解決了該問題。下面,我將需要注意的點(diǎn)記錄下來,以便查詢。
第一種方法,也就是直接QOpenGLWidget的paintGL函數(shù)中繪制兩者,其步驟為:
void GLWidget::paintGL() {
QPainter painter;
painter.begin(this);
painter.beginNativePainting();
//繪制3D內(nèi)容
......
//注意:1、一定要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等;2、如果開啟深度測試,一定要關(guān)閉。例如:
m_program->release();
m_vao.release();
m_logoVbo.release();
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
painter.endNativePainting();
//繪制2D內(nèi)容
......
painter.end();
}
第二種方法,是在網(wǎng)上找的,其貼子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,該貼主應(yīng)該無法使用第一種方法,所以,另辟蹊徑。現(xiàn)將方法也列出來,便于杳找,如若想詳細(xì)了解,請(qǐng)到上面的網(wǎng)址。其步驟為:首先,重載兩個(gè)函數(shù)paintGL、paintEvent;然后,就是實(shí)現(xiàn),但是這種方法需要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要關(guān)閉深度測試。
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的調(diào)用是一一對(duì)應(yīng)的;起初,我還以為paintGL每次更新,會(huì)被調(diào)用兩次,經(jīng)過測試,其只被paintEvent函數(shù)調(diào)用一次。
兩種方法都有其優(yōu)點(diǎn),在根據(jù)需要選擇;第二種方法,比較適合擴(kuò)展,無需改動(dòng)原因的代碼,只需要重載paintEvent,并在函數(shù)中調(diào)用paintGL,并繪制2D內(nèi)容即可。
總結(jié)
以上是生活随笔為你收集整理的qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刀圈TD正式版通关攻略
- 下一篇: x12arima季节调整方法_《时间序列