添加到 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

如何在 QGraphicsScene 中缩放图像? (Qt 5.11)

如何将 QML 映射添加到 QGraphicsscene?

将 QWidget 添加到 QGraphicsScene

qt - 在 QGraphicsScene 中如何捕捉特定项目

QT:我需要通过 QGraphicsScene 获取添加到 QGraphicsView 的图像坐标