qt - 通过 QGraphicsScene 中的 addWidget 嵌入 QOpenGLWidget
问题描述
前段时间我创建了一个子类QGraphicsView
,我称之为MultiWidget
. 它的目的是保存我使用的其他一些小部件,我使用 addWidget 添加到QGraphicsScene
关联到我的MultiWidget
.
这个想法是,MultiWidget
应该呈现所有这些添加的小部件的“笔记本式”视图,从上到下显示它们,一个在另一个下,并给(作为一个额外的噱头)一个小绿色旋钮,用它可以切换小部件隐藏和显示之间:
现在我尝试添加一个新的小部件GPURenderWidget
,从QOpenGLWidget
withaddWidget
方法派生MultiWidget
,它首先看起来没有错误。但是: 显示的内容GPURenderWidget
没有在 :paintGL
的窗格上正确显示MultiWidget
: 显示了初始图片,但是尽管在一系列paintGL
调用中生成了新帧,但GPURenderWidget
MultiWidget 中的视图没有得到更新(以下是呈现的静止视图):
我已经将我viewport
的设置MultiWidget
为OpenGL-form
via
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
我是否被迫放弃这种方法?什么是最好的选择?我应该创建一个GPURenderItem
派生的QGraphicsItem
并将其添加到QGraphicsView
viaaddItem()
吗?但我更愿意GPURenderWidget
保留一个QOpenGLWidget
,以便它可以在其他地方用作独立的小部件。还是我必须牺牲整个MultiWidget
方法addWidget
来 a QGraphicsScene
?
解决方案
的文档QGraphicsProxyWidget
有一些注释/警告,特别是......
警告:这个类是为了方便桥接 QWidgets 和 QGraphicsItems 而提供的,它不应该用于高性能场景。特别是,将小部件嵌入到场景中,然后通过使用 OpenGL 视口的 QGraphicsView 显示将不适用于所有组合。
和...
请注意,不能嵌入具有 Qt::WA_PaintOnScreen 小部件属性集的小部件和包装外部应用程序或控制器的小部件。例如 QOpenGLWidget 和 QAxWidget。
因此,我认为您在将 aQOpenGLWidget
直接嵌入 a 方面并不走运QGraphicsScene
。
一种可能的替代方法是使用帧缓冲区对象进行 OpenGL 渲染,并将生成的帧从 FBO 抓取/blit 到可以嵌入的更简单的自定义小部件。
推荐阅读
- python - 树莓派相机模块问题 OSError
- sql - 将字典列表转换为 Postgres jsonb 中的字典
- java - 如果没有 text 或 content desc 属性或者不是唯一属性,如何在 appium 中定位元素
- javascript - DynamoDB docclient get 返回空对象
- python - 必须将列表列表映射到另一个具有相同长度的列表并在 python 中写入 excel
- c# - c#业务中心重定向url后如何获取代码参数?
- visual-studio - 解决方案资源管理器在 Visual Studio 中显示错误
- move - 如何将添加的新记录的值从子文件移动到 RPGLE 中的物理文件?
- c++ - 使用 QMetaEnum 将枚举转换为字符串
- ios - 如何在 Xamarin 表单 iOS 应用程序中打开 Apple Store 而不是 iTunes 商店