【问题标题】:How to use QPainter in QOpenGlWidget's paintGL如何在 QOpenGlWidget 的 paintGL 中使用 QPainter
【发布时间】:2016-04-12 09:12:21
【问题描述】:

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

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

我的代码是这样的:

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

    //Where to safely use the QPainter?
}

【问题讨论】:

    标签: qt opengl


    【解决方案1】:

    只需将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);
        }
    };
    

    【讨论】:

    • 我试过这个,但是我所有的原始opengl绘画都消失了......我使用的是qt 5.4.1,这是版本问题吗?
    • 奇怪,使用普通的 opengl 函数它可以工作,但它不适用于着色器。你能在paintGL() 期间尝试使用着色器吗?
    • 很抱歉,我目前没有太多时间进行实验。但如果你能准备一些我可以轻松粘贴到我的 initializeGL() 和 paintGL() 的代码,我可以测试它。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多