在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget

Posted

技术标签:

【中文标题】在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget【英文标题】:Changing QWidget with QGlWidget in Qt 4.8.0 【发布时间】:2012-02-29 15:54:06 【问题描述】:

我正在开发一个当前使用 QWidgets 来渲染移动图像的应用程序,我正在尝试从使用 QWidgets 转移到 QGlWidgets,但我的应用程序不断崩溃。 我所做的唯一修改是:

从此:

class MyClass : public QWidget 

     MyClass(QWidget *parent):QWidget(parent)
     
          ...
     

到这里:

class MyClass : public QGlWidget 

     MyClass(QWidget *parent):QGlWidget(QGLFormat(QGL::SampleBuffers),parent)
     
          ...
     

我是否需要更多地修改我的代码,如果需要,还需要进行哪些其他修改?

我目前正在使用 Visual Studio 2010 和 qt 4.8.0

【问题讨论】:

【参考方案1】:
MyClass(QWidget *parent):QGlWidget(QGLFormat(QGL::SampleBuffers),parent)
     
          ...
     

看起来您正在创建一个临时 QGLFormat 对象,该对象通过引用传递给 QGLWidget,当该临时对象超出范围时,您将获得一个无效的引用。

我会使用不同形式的构造函数。

【讨论】:

我删除了这个位“QGLFormat(QGL::SampleBuffers)”,它仍然崩溃。如果我使用发布库构建,应用程序就会死掉,没有错误消息。使用调试器,调试器指向函数 void setHasComplexGeometry(bool hasComplexGeometry),来自 qglengineshadermanager_p.h【参考方案2】:

我发现了问题所在。 在我的 QWidget 类中,我有一个成员对象 QPainter,我将在绘制事件中重用它。我一直在寻找,发现这是一个不好的做法,所以现在我在绘制事件开始时声明了一个 QPainter 对象,我的问题就解决了。

【讨论】:

以上是关于在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.6.3 中 QGLWidget 上的 3D 文本

Qt连接QTableWidget和QGLWidget

QGLWidget 在 QT 中是如何工作的?

Qt:QMouseEvent 没有从 QGLWidget 传播出去

Qt OpenGL 渲染文本问题 QGLWidget

如何让 qGLWidget 在 Visual Studio 中显示