QT OpenGL问题遇到了从5.10.0升级到5.12.1



i具有旧版C QT应用程序,该应用程序已通过许多许多版本的QT进行了升级。我最近将其从QT 5.10.0升级到5.12.1,现在突然之间,我的两个OpenGL显示器都遇到问题,我无法弄清楚原因。

问题的快速摘要:

第一个显示绘制3D表面图。它非常旧(包含使用GLEW的旧控件),并且使用了现在过时的QGLWIDGET。我不能改变这个。

class GLAdapterWidget : public QGLWidget
{
    // ...A whole lot of legacy code which has not changed...
public:
    // How I update the display
    void doUpdate()
    {
        someLegacyGLDrawingFunction();
        updateGL();  // fails if attribute Qt::WA_Mapped not set
    }
};

现在的问题是,一旦加载,它仍然看起来完全是黑色的,直到我实际单击其边界内某个地方的鼠标。然后突然它的GL图显示完美。这不是在QT 5.10.0中发生的。

调试我至少能够将其跟踪到窗口小部件属性 qt :: WA_MAPPED 。该属性没有在我的小部件上设置,因此QT在我单击它之前不会绘制它。一旦我单击其边界QT集,属性就可以正常工作。但是,我尝试解决方法(例如呼叫show()或尝试在软件中设置该属性)没有效果。

第二个显示更现代,并使用Qopenglwidget。它显示了连续更新的实时相机图像。

class VideoDisplay : public QOpenGLWidget, 
                     protected QOpenGLFunctions_3_3_Core
{
    virtual void initializeGL() override
    {
        initializeOpenGLFunctions();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-width()/2, width()/2, height()/2, -height()/2, -1, 1); 
        glClearColor(0.25f,0.25f,0.25f,1.0f);
    }
    virtual void paintGL() override
    {
        // Legacy Code that draws a live image using glDrawPixels and which has not changed.
    }
    virtual void resizeGL(int w, int h) override
    {
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-w/2, w/2, h/2, -h/2, -1, 1);
    }
};

一开始似乎很好。图像显示并更新。但是,如果我去显示一个较旧的,landapterwidget的实例,然后返回此显示(videodisplay),它突然看起来是黑色的,没有什么能让它重新绘制的。调试我看到DaintGl仍在称呼,并且具有有效的图像。所有参数看起来都不错。但是什么都没有显示。

我意识到这并不是太多了。这个代码是如此古老而大,以至于我觉得张贴它的大部分内容不会做太多,但混乱的事情很重要。

我意识到,在这两种情况下,罪魁祸首可能都是基于QGLwidget的较旧的显示。但是,当我说我不能抛弃该代码时,我不是在开玩笑

所以我(拼命地)专注于以下事实:这在5.10.0中起作用,并且在5.12.1 中不在特定的关键架构QT在5.10.0到5.12.1之间的变化可能是罪魁祸首,可以为我提供调查或解决方法的途径。

我需要一个创可贴。我不介意做这项工作,我只是不知道从哪里开始。

我在此处向QT报告了此问题:https://bugreports.qt.io/browse/qtbug-72668以及解决方案,直到解决。

解决方法:在将设置为一定间隔的父QMainWindow上安装QTimer。窗口暴露后,孩子qopenglwidget isvalid()返回true之后,将小部件大小尺寸大小为不同的大小(注意:它的尺寸不能相同,repaint(),update(),更新()或更新(0,0,0,0,0,0宽度,高度)工作)

    QWindow *window = windowHandle();
    if(window && window->isExposed() && glWidget->isValid()) {
        resize(801,601);
        _timer.stop();
    }

最新更新