不久前,我创建了一个QGraphicsView的子类,我称之为MultiWidget。它的目的是保存我使用的其他小部件,我将这些小部件与addWidget一起添加到与QGraphicsScene相关联的MultiWidget中。
其想法是,MultiWidget应该呈现所有这些添加的小部件的“像笔记本一样”的视图,从上到下显示它们,一个在另一个下面显示,然后(作为一个额外的噱头)提供一个绿色的小旋钮,可以在隐藏的和显示的之间切换:

现在,我尝试添加一个新的小部件GPURenderWidget,它是从QOpenGLWidget派生出来的,它使用了MultiWidget的addWidget方法,该方法最初似乎没有出错。但是:通过paintGL显示的paintGL的内容不能正确地显示在MultiWidget的窗格上:显示了初始图片,但是尽管在GPURenderWidget中的paintGL调用序列中生成了新的帧,但MultiWidget中的视图没有被更新(下面是显示的静止视图):

我已经将viewport of my MultiWidget设置为OpenGL-form
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));我是不是被迫放弃这种做法?最好的选择是什么?我应该创建一个从QGraphicsItem派生的QGraphicsItem并通过addItem()将它添加到QGraphicsView中吗?但是我更愿意让GPURenderWidget保持一个QOpenGLWidget,这样它就可以在其他地方作为独立的小部件使用。或者我必须把整个MultiWidget-approach和addWidget一起牺牲给QGraphicsScene
发布于 2021-02-06 17:20:32
QGraphicsProxyWidget的文档有一些注释/警告,特别是.
警告:这个类是为了方便而提供的,当连接QWidgets和QGraphicsItems时,它不应该用于高性能的场景。特别是,将小部件嵌入到场景中,然后通过使用QGraphicsView视口的OpenGL显示,并不能适用于所有组合。
还有..。
请注意,不能嵌入具有Qt::WA_PaintOnScreen小部件属性集的小部件和包装外部应用程序或控制器的小部件。例如QOpenGLWidget和QAxWidget。
因此,我认为在直接将QOpenGLWidget嵌入到QGraphicsScene中是不走运的。
一种可能的选择是使用帧缓冲对象进行OpenGL呈现,并将从FBO生成的帧抓取/混合到一个可以嵌入的更简单的定制小部件。
https://stackoverflow.com/questions/66078292
复制相似问题