首页 > 解决方案 > 通过 QGraphicsScene 中的 addWidget 嵌入 QOpenGLWidget

问题描述

前段时间我创建了一个子类QGraphicsView,我称之为MultiWidget. 它的目的是保存我使用的其他一些小部件,我使用 addWidget 添加到QGraphicsScene关联到我的MultiWidget.

这个想法是,MultiWidget应该呈现所有这些添加的小部件的“笔记本式”视图,从上到下显示它们,一个在另一个下,并给(作为一个额外的噱头)一个小绿色旋钮,用它可以切换小部件隐藏和显示之间:

在此处输入图像描述

现在我尝试添加一个新的小部件GPURenderWidget,从QOpenGLWidgetwithaddWidget方法派生MultiWidget,它首先看起来没有错误。但是: 显示的内容GPURenderWidget没有在 :paintGL的窗格上正确显示MultiWidget: 显示了初始图片,但是尽管在一系列paintGL调用中生成了新帧,但GPURenderWidgetMultiWidget 中的视图没有得到更新(以下是呈现的静止视图):

在此处输入图像描述

我已经将我viewport的设置MultiWidgetOpenGL-formvia

 setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

我是否被迫放弃这种方法?什么是最好的选择?我应该创建一个GPURenderItem派生的QGraphicsItem并将其添加到QGraphicsViewviaaddItem()吗?但我更愿意GPURenderWidget保留一个QOpenGLWidget,以便它可以在其他地方用作独立的小部件。还是我必须牺牲整个MultiWidget方法addWidget来 a QGraphicsScene

标签: qtqgraphicsviewqgraphicssceneqtopengl

解决方案


的文档QGraphicsProxyWidget有一些注释/警告,特别是......

警告:这个类是为了方便桥接 QWidgets 和 QGraphicsItems 而提供的,它不应该用于高性能场景。特别是,将小部件嵌入到场景中,然后通过使用 OpenGL 视口的 QGraphicsView 显示将不适用于所有组合。

和...

请注意,不能嵌入具有 Qt::WA_PaintOnScreen 小部件属性集的小部件和包装外部应用程序或控制器的小部件。例如 QOpenGLWidget 和 QAxWidget。

因此,我认为您在将 aQOpenGLWidget直接嵌入 a 方面并不走运QGraphicsScene

一种可能的替代方法是使用帧缓冲区对象进行 OpenGL 渲染,并将生成的帧从 FBO 抓取/blit 到可以嵌入的更简单的自定义小部件。


推荐阅读