【问题标题】:How can QWindow replace QGLWidget?QWindow如何替代QGLWidget?
【发布时间】:2013-08-01 17:30:54
【问题描述】:

QT 文档说,从 qt5 开始,您应该使用 QOpenGL* 类而不是 QGL*。

问题是没有 QGLWidget 替换。我发现您应该将 QWindow 与 QOpenGLContext 结合使用并调用 setSurfaceType( OpenGLSurface );。

唯一的问题是 QWindow 不能有 QWidget 作为父级。那么我怎样才能嵌入一个 QWindow aka。我的 OpenGL 绘图表面到其他小部件?

【问题讨论】:

  • 我要引用我的另一条评论:基本上如this blog post 中所述。对于其他所有内容,您只需阅读相关类的文档。我会使用 QWindow,在 create() 之前调用 setSurfaceType(QSurface::OpenGLSurface) ,然后创建一个新的 QOpenGLContext 并使用它的 makeCurrent() 函数将 QWindow 传递给它。如需更简单的解决方案,请等待5.2.0
  • 另外,请阅读 this discussion 以了解弃用可能是过早的一个次要版本。
  • @Bart 我不只是想发布一些链接并将其作为答案插入,但我将从帖子中复制一些代码 sn-ps 并作为答案跨度>
  • 不幸的是,他们没有在 5.2 中添加 OpenGLWidget -_-
  • @Alexander 初步支持(未记录)将在 5.3 中,实际版本将在 5.4 中,目前正在进行中,您可以看到 here (header)here (source)。 (我发布的链接将保持不变,因此如果您稍后阅读此内容,它们可能不会反映进度状态)

标签: qt opengl qt5


【解决方案1】:

QT 5.1 在 OpenGL 和 QWidget(和派生)方面处于一种奇怪的情况。没有 QGLWidget 替换,但所有其他 QGL 类都有明确的替换。

如果您不想使用旧的QGLWidget,您确实必须用QWindow 制造自己的替代品。所以,首先你设置你的QWindow 然后,正如你所说的,在你调用create(); 之前调用setSurfaceType( OpenGLSurface );。然后你创建一个新的QOpenGLContext 并使用它的makeCurrent() 函数并传递你的QWindow。然后你使用QWidget::createWindowContainer(window);QWindow创建一个QWidget

但这只是一个临时的 hack,除非你真的想混合 QtQuick 和 QWidget,否则你不应该使用它。然后,您可以用 5.2.0 5.4.0 称为 QOpenGLWidget

中的实际替换来替换这个临时 hack

【讨论】:

  • +1,谢谢。你那里有所有的信息,我认为我基本上陈述相同的内容对我来说有点毫无意义。
  • 在我尝试移植的代码中,有被覆盖的事件以及绘制、更新方法等。我想移植这种行为没有简单的方法?
  • @Alexander 如果您想尽量减少工作量,我建议您等到 5.2.0。如果您现在很想这样做,请查看文档中的 OpenGLWindow 示例
  • 我会等的。但我必须在 10 月之前将项目移植到 OS X。
  • QOpenGLWidget 真的在 Qt 5.2 中实现了吗?您指向 QOpenGLWidget 票证的链接表明它仍未解决。如果是这样,您的最后一段可能具有误导性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多