将 QOpenGLWidget 与 QGraphicsView 一起使用:视口未更新?

Using QOpenGLWidget with QGraphicsView: viewport not updating?

我想使用 openGL 来渲染 QGraphicsview 项目,这样我就可以节省 CPU 电量。在文档中,它指出我必须做的是添加一个 QOpenGLWidget 作为 QGraphicsview 的视口。这就是我正在做的:

QOpenGLWidget *glWidget = new QOpenGLWidget();
ui->drawScreen->setViewport(glWidget);
ui->drawScreen->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
ui->drawScreen->update();

(ui->drawScreen 是我的 QgraphicsView)

当我在屏幕上绘制某些东西时,它可以正确绘制,但在一定时间后我想用淡入淡出动画删除该项目。这不会引起屏幕更新,即当我这样做时:

double opacity = 1.0 - ((elapsed - annotationFrameOut) / (double)fadeOutFrames);
(*i)->setOpacity(opacity);

(*i) 是一项。

或者这个:

scene.removeItem(item);

在视觉上,没有任何反应。只有当我调整屏幕大小时,项目才会消失,或者显示正确的不透明度以防它褪色。

此外,当我移动一个项目时,位置不会消失,因此会产生拖动效果。选择矩形或输入文本项时也是如此(边界矩形被多次绘制)。

这似乎是一个简单的更新问题,但我不知道该怎么办,我似乎也没有在网上找到这个问题。我正在使用 Windows.

感谢您的宝贵时间。

编辑: 举例说明问题的图片。蓝色矩形是永远不会删除的选择矩形(除非我重新调整 window 的大小)

编辑 2: 使用 QGLWidget

的代码
QGLWidget *viewPort = new QGLWidget(QGLFormat(QGL::SampleBuffers | QGL::AlphaChannel), ui->drawScreen);

ui->drawScreen->setViewport(viewPort);
ui->drawScreen->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
ui->drawScreen->update();

编辑 3: 在我的应用程序中,我在 QGraphicsView 下方播放了一段视频。每次出现新帧时,我都会通过更新 QLabel 来显示视频。

我尝试更新 QGraphicsPixmapImageQPixmap 而不是使用 QLabel。如果现在我在这张图片上画图,我猜是因为图片在不断更新。但是在图片之外还是不行。

显式 update() 调用是不必要的。这看起来像一个 Qt 错误。 QGraphicsView does some magicQGLWidget 以使其用作视口。最有可能的是,这个魔法还没有被移植到 QOpenGLWidget.

上工作

作为解决方法,请改用 QGLWidget

看来问题出在我用来更改视图背景颜色的 stylesheet 上。将 stylesheet 添加到 widget 也会产生相同的错误。使用 stylesheet 时,视口会变成黑色,并且项目的刷新似乎无法正常工作。

我删除了 stylesheet 并通过重新实现 drawBackground 函数更改了背景颜色。

感谢 Kuba Ober 帮助我解决这个问题。

样式表以某种方式产生了重绘错误,即使在我的情况下我已经删除了样式表并且一切正常。