添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?
Posted
技术标签:
【中文标题】添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?【英文标题】:How to update OpenGL drawings(QOpenGLWidget) when added to QGraphicsScene? 【发布时间】:2019-08-19 10:00:00 【问题描述】:我的实现基于此示例。 https://doc.qt.io/qt-5/qtopengl-2dpainting-example.html
示例的作用是渲染/动画 2 个图像。一种是使用本机 qt 功能渲染的,另一种是使用 OpenGL 渲染的。这里的所有都是它的。正在绘制的图像完全相同。
示例工作正常。我可以看到两个图像都有动画。然后,当我尝试通过在 QGraphicsScene 中添加一个 Window 类(包含 QOpenGLWidget)来进行更改时; QOpenGLWidget 停止自我更新。
原来的main.cpp
int main(int argc, char *argv[])
QApplication app(argc, argv);
QSurfaceFormat fmt;
fmt.setSamples(4);
QSurfaceFormat::setDefaultFormat(fmt);
Window window;
window.show();
return app.exec();
更改了 main.cpp
int main(int argc, char *argv[])
QApplication app(argc, argv);
QSurfaceFormat fmt;
fmt.setSamples(4);
QSurfaceFormat::setDefaultFormat(fmt);
Window window;
//window.show();
QGraphicsScene scene;
scene.addWidget(&window);
scene.addText("Hello");
QGraphicsView view(&scene);
view.show();
return app.exec();
这是输出。
此处提供完整的源代码。 https://github.com/syaifulnizamyahya/QT2dpainting
【问题讨论】:
请提供一个最小的工作示例,其中包含您所做的所有更改。 我提供了完整的源代码。我所做的唯一更改是 main.cpp 中的几行,我已经展示了。 这似乎或多或少是您的previous question 的欺骗,在这种情况下,同样的comment 也适用。 @G.M.是的。我这样做是因为在我的上一个问题中,我还有其他错误。在这里,我可以使其更具体,因为只有 1 处更改。并且没有错误。另外,我已经删除了 QGraphicsProxyWidget,我仍然遇到同样的问题。 @EddyAlleman 我添加了工作示例。 【参考方案1】:在文档中 QGraphicsProxyWidget *QGraphicsScene::addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags())
请注意,带有 Qt::WA_PaintOnScreen 小部件属性集的小部件 包装外部应用程序或控制器的小部件不是 支持的。例如 QGLWidget 和 QAxWidget。
我认为你运气不好。可能是 QOpenGLWidget 诞生时文档从未被改编过。
还有一些关于 Jira 的错误报告,看起来与您的情况非常相似: https://bugreports.qt.io/browse/QTBUG-44063
如果我是你,我肯定会在兴趣邮件列表中询问,这就是 Qt 开发人员经常来的地方。
【讨论】:
以上是关于添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QGraphicsScene 中缩放图像? (Qt 5.11)