从 QGLWidget 迁移到 QWindow

Posted

技术标签:

【中文标题】从 QGLWidget 迁移到 QWindow【英文标题】:Moving from QGLWidget to QWindow 【发布时间】:2014-02-11 13:43:31 【问题描述】:

我有一些使用 Qt 4 的代码。我想将它迁移到 Qt 5 并切换到 QOpenGL 的东西。我无法理解来自void paintGL()void initializeGL() 的代码需要放在QWindow 中的什么位置。谁能帮我举个例子?

【问题讨论】:

【参考方案1】:

我创建了一个将 QWindow 与 OpenGL 结合使用的简单示例。

为了简化 OpenGL 开发,我创建了一个抽象类 GLWindow,其中包含虚函数 initializeGL()paintGL()resizeGL(int w, int h)。我相信源代码显示了旧样式和新样式之间的关系。

示例可在此处获得:

https://github.com/mortennobel/QtOpenGLChapter/tree/master/OpenGL3xAlt

【讨论】:

这就是我要找的。谢谢!【参考方案2】:

Qt 有at least one example (Overpainting) 可以将小部件放在 OpenGL 场景上。通过观察,似乎最简单的方法是从 QGLWidget 继承而不是 QWidget 并覆盖适当的虚函数以进行初始化和绘制。

【讨论】:

【参考方案3】:

在 qtbase/examples/opengl 中使用 QWindow 和 OpenGL 的标准示例是 hellowindow。

initializeGL 和paintGL 没有直接的替代品。相反,您可以这样做:

有一个表面类型为 OpenGLSurface 的 QWindow。 创建具有匹配格式的 QOpenGLContext。 当窗口接收到暴露事件时,开始渲染(makeCurrent,您的 GL 调用,最后是 swapBuffers)。

【讨论】:

以上是关于从 QGLWidget 迁移到 QWindow的主要内容,如果未能解决你的问题,请参考以下文章

QDockWidget - QGlWidget - 当小部件从停靠栏中拖出时,可绘制无效

在 QGLWidget 中将位复制到 QtImage

在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget

如何将 QWidget 添加到 QGLWidget

QGLWidget RenderText() 崩溃和文本混乱

将只有插槽的 QGLWidget 移动到不同的线程