在 QGraphicsScene 中通过 addWidget 嵌入 QOpenGLWidget

Embedding a QOpenGLWidget via addWidget in QGraphicsScene

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

关联的 QGraphicsScene

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

现在我尝试添加一个新的小部件 GPURenderWidget,它派生自 QOpenGLWidget,使用 MultiWidgetaddWidget 方法,最初似乎没有错误。 但是:通过paintGL显示的GPURenderWidget的内容在MultiWidget的窗格中显示不正确:初始图片是已显示,但尽管在 GPURenderWidget 中的一系列 paintGL 调用中生成了新帧,MultiWidget 中的视图并未更新(以下是呈现的静止视图):

我已经通过

MultiWidgetviewport设置为OpenGL-form
 setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

我是否被迫放弃这种方法?最好的选择是什么?我应该创建一个从 QGraphicsItem 派生的 GPURenderItem 并通过 addItem() 添加到 QGraphicsView 吗?但我更愿意让 GPURenderWidget 保持 QOpenGLWidget 以便它可以在其他地方用作独立的小部件。或者我必须牺牲整个 MultiWidget-方法 addWidgetQGraphicsScene?

QGraphicsProxyWidget 的文档有几个 notes/warnings,特别是...

Warning: This class is provided for convenience when bridging QWidgets and QGraphicsItems, it should not be used for high-performance scenarios. In particular, embedding widgets into a scene that is then displayed through a QGraphicsView that uses an OpenGL viewport will not work for all combinations.

和...

Note that widgets with the Qt::WA_PaintOnScreen widget attribute set and widgets that wrap an external application or controller cannot be embedded. Examples are QOpenGLWidget and QAxWidget.

所以我认为您不希望将 QOpenGLWidget 直接嵌入 QGraphicsScene

一种可能的替代方法是使用 framebuffer object 进行 OpenGL 渲染,grab/blit 从 FBO 生成的帧到更简单的自定义小部件,可以 被嵌入。