将 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 来显示视频。
我尝试更新 QGraphicsPixmapImage
的 QPixmap
而不是使用 QLabel
。如果现在我在这张图片上画图,我猜是因为图片在不断更新。但是在图片之外还是不行。
显式 update()
调用是不必要的。这看起来像一个 Qt 错误。 QGraphicsView
does some magic 到 QGLWidget
以使其用作视口。最有可能的是,这个魔法还没有被移植到 QOpenGLWidget
.
上工作
作为解决方法,请改用 QGLWidget
。
看来问题出在我用来更改视图背景颜色的 stylesheet
上。将 stylesheet
添加到 widget
也会产生相同的错误。使用 stylesheet
时,视口会变成黑色,并且项目的刷新似乎无法正常工作。
我删除了 stylesheet
并通过重新实现 drawBackground
函数更改了背景颜色。
感谢 Kuba Ober 帮助我解决这个问题。
样式表以某种方式产生了重绘错误,即使在我的情况下我已经删除了样式表并且一切正常。
我想使用 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 来显示视频。
我尝试更新 QGraphicsPixmapImage
的 QPixmap
而不是使用 QLabel
。如果现在我在这张图片上画图,我猜是因为图片在不断更新。但是在图片之外还是不行。
显式 update()
调用是不必要的。这看起来像一个 Qt 错误。 QGraphicsView
does some magic 到 QGLWidget
以使其用作视口。最有可能的是,这个魔法还没有被移植到 QOpenGLWidget
.
作为解决方法,请改用 QGLWidget
。
看来问题出在我用来更改视图背景颜色的 stylesheet
上。将 stylesheet
添加到 widget
也会产生相同的错误。使用 stylesheet
时,视口会变成黑色,并且项目的刷新似乎无法正常工作。
我删除了 stylesheet
并通过重新实现 drawBackground
函数更改了背景颜色。
感谢 Kuba Ober 帮助我解决这个问题。
样式表以某种方式产生了重绘错误,即使在我的情况下我已经删除了样式表并且一切正常。