在QGraphicsView中使用QOpenGLWidget:viewport没有更新?

时间:2015-07-27 16:14:59

标签: c++ qt opengl qgraphicsview

我想使用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。

感谢您的时间。

编辑: 图片举例说明了这个问题。蓝色矩形是永远不会删除的选择矩形(除非我重新调整窗口大小) Blue rectangles are the selection rectangle that is never removed (unless I re-size the 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来显示视频。

我没有使用QLabel,而是尝试更新QPixmap的{​​{1}}。如果现在我在此图像的顶部绘制正确刷新的图形,我想因为图片不断更新。但是在图片之外它仍然不起作用。

3 个答案:

答案 0 :(得分:1)

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

作为解决方法,请改用QGLWidget

答案 1 :(得分:1)

It seems the problem lies with the stylesheet I used to change the background color of the view. Adding a stylesheet to the widget also produces the same bug. With a stylesheet the view-port just becomes black and the refresh of items doesn't seem to work properly.

I removed the stylesheet and changed the background-color by re-implementing the drawBackground function.

Thanks to Kuba Ober for helping me figure out this.

答案 2 :(得分:0)

在某种程度上,样式表会生成重绘错误,即使在我的情况下,我已删除样式表,一切正常。