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


你可能感兴趣的:(在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程)