如何在QOpenGlWidget的paintGL中使用QPainter

时间:2016-04-12 09:12:21

标签: qt opengl

我最近从QGLWidget切换到新的QOpenGlWidget,因为后者缺少renderText()函数。我正在考虑使用QPainter在我的openGL 3D图形上绘制一些文本。

我最初通过paintGL()函数渲染所有内容,如何在该函数中安全地添加QPainter?

我的代码是这样的:

paintGL()
{
    //Raw OpenGL codes
    //....

    //Where to safely use the QPainter?
}

2 个答案:

答案 0 :(得分:3)

只需将QPainter来电添加到paintGL()方法中即可。

paintGL()
{
    // OpenGL code...

    QPainter p(this);
    p.drawText(...);

}

paintGL()调用QOpenGLWidget::paintEvent()函数,因此使用QPainter时不会出现任何问题。

小例子:

class CMyTestOpenGLWidget : public QOpenGLWidget
{
public:
    CMyTestOpenGLWidget(QWidget* parent) : QOpenGLWidget(parent) {}

    void initializeGL() override
    {
        glClearColor(0, 0, 0, 1);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHT0);
        glEnable(GL_LIGHTING);
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
        glEnable(GL_COLOR_MATERIAL);
    }

    void paintGL() override
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBegin(GL_TRIANGLES);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f(0.5, -0.5, 0);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f(0.0, 0.5, 0);
        glEnd();

        QPainter p(this);
        p.setPen(Qt::red);
        p.drawLine(rect().topLeft(), rect().bottomRight()); 
    }

    void resizeGL(int w, int h) override
    {
        glViewport(0, 0, w, h);
    }
};

enter image description here

答案 1 :(得分:0)

您应该像这样在paintGL()中使用QPainter:

paintGL()
{
    QPainter painter(this);
    //painter.draw();
    painter.beginNativePainting();
    //Opengl api
    painter.endNativePainting();
    painter.end();
}

但是我发现不能以这种方式绘制纹理。