在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内容即可。