从 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 - 当小部件从停靠栏中拖出时,可绘制无效
在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget