在 QGraphicsScene 中通过 addWidget 嵌入 QOpenGLWidget
Embedding a QOpenGLWidget via addWidget in QGraphicsScene
前段时间我创建了一个 QGraphicsView
的子类,我称之为 MultiWidget
。它的目的是保存我使用的其他一些小部件,我用 addWidget 添加到与我的 MultiWidget
.
关联的 QGraphicsScene
这个想法是,MultiWidget
应该呈现所有这些添加的小部件的“类似笔记本”的视图,从上到下显示它们,一个在另一个下面,并给(作为一个额外的噱头)一点绿色旋钮,可以在隐藏和显示之间切换小部件:
现在我尝试添加一个新的小部件 GPURenderWidget
,它派生自 QOpenGLWidget
,使用 MultiWidget
的 addWidget
方法,最初似乎没有错误。 但是:通过paintGL
显示的GPURenderWidget
的内容在MultiWidget
的窗格中显示不正确:初始图片是已显示,但尽管在 GPURenderWidget
中的一系列 paintGL
调用中生成了新帧,MultiWidget 中的视图并未更新(以下是呈现的静止视图):
我已经通过
将MultiWidget
的viewport
设置为OpenGL-form
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
我是否被迫放弃这种方法?最好的选择是什么?我应该创建一个从 QGraphicsItem
派生的 GPURenderItem
并通过 addItem()
添加到 QGraphicsView
吗?但我更愿意让 GPURenderWidget
保持 QOpenGLWidget
以便它可以在其他地方用作独立的小部件。或者我必须牺牲整个 MultiWidget
-方法 addWidget
到 QGraphicsScene
?
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 生成的帧到更简单的自定义小部件,可以 被嵌入。
前段时间我创建了一个 QGraphicsView
的子类,我称之为 MultiWidget
。它的目的是保存我使用的其他一些小部件,我用 addWidget 添加到与我的 MultiWidget
.
QGraphicsScene
这个想法是,MultiWidget
应该呈现所有这些添加的小部件的“类似笔记本”的视图,从上到下显示它们,一个在另一个下面,并给(作为一个额外的噱头)一点绿色旋钮,可以在隐藏和显示之间切换小部件:
现在我尝试添加一个新的小部件 GPURenderWidget
,它派生自 QOpenGLWidget
,使用 MultiWidget
的 addWidget
方法,最初似乎没有错误。 但是:通过paintGL
显示的GPURenderWidget
的内容在MultiWidget
的窗格中显示不正确:初始图片是已显示,但尽管在 GPURenderWidget
中的一系列 paintGL
调用中生成了新帧,MultiWidget 中的视图并未更新(以下是呈现的静止视图):
我已经通过
将MultiWidget
的viewport
设置为OpenGL-form
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
我是否被迫放弃这种方法?最好的选择是什么?我应该创建一个从 QGraphicsItem
派生的 GPURenderItem
并通过 addItem()
添加到 QGraphicsView
吗?但我更愿意让 GPURenderWidget
保持 QOpenGLWidget
以便它可以在其他地方用作独立的小部件。或者我必须牺牲整个 MultiWidget
-方法 addWidget
到 QGraphicsScene
?
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 生成的帧到更简单的自定义小部件,可以 被嵌入。