Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何在QOpenGlWidget和x27中使用QPainter;s油漆_Qt_Opengl - Fatal编程技术网

Qt 如何在QOpenGlWidget和x27中使用QPainter;s油漆

Qt 如何在QOpenGlWidget和x27中使用QPainter;s油漆,qt,opengl,Qt,Opengl,我最近从QGLWidget切换到了新的QOpenGlWidget,因为后者缺少renderText()函数。我正在考虑使用QPaint在我的openGL 3D图形上绘制一些文本 我最初通过paintGL()函数渲染所有内容,如何在该函数中安全地添加QPainter 我的代码如下: paintGL() { //Raw OpenGL codes //.... //Where to safely use the QPainter? } paintGL() { QPa

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

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

我的代码如下:

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

    //Where to safely use the QPainter?
}
paintGL()
{
    QPainter painter(this);
    //painter.draw();
    painter.beginNativePainting();
    //Opengl api
    painter.endNativePainting();
    painter.end();
}

只需将
QPainter
调用直接添加到
paintGL()
方法中即可

paintGL()
{
    // OpenGL code...

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

}
QOpenGLWidget::paintEvent()
调用了
paintGL()
函数,因此使用
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);
    }
};

您应该在paintGL()中使用QPainter,如下所示:

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

    //Where to safely use the QPainter?
}
paintGL()
{
    QPainter painter(this);
    //painter.draw();
    painter.beginNativePainting();
    //Opengl api
    painter.endNativePainting();
    painter.end();
}

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

我已经尝试过了,但是我所有的原始opengl绘制都消失了。。。我使用的是Qt5.4.1,这是一个版本问题吗?奇怪的是,使用正常的opengl函数它可以工作,但它不能与着色器一起工作。你能在
paintGL()
期间尝试使用着色器吗?很抱歉,我现在没有太多时间进行实验。但是如果你能准备一些代码,我可以很容易地粘贴到我的initializeGL()和paintGL()中,我可以测试它。