【发布时间】:2015-07-27 16:14:59
【问题描述】:
我想使用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。
感谢您的宝贵时间。
编辑: 举例说明问题的图片。蓝色矩形是永远不会删除的选择矩形(除非我重新调整窗口大小)
编辑 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,而是尝试更新QGraphicsPixmapImage 的QPixmap。如果现在我在此图像上绘制绘图正在正确刷新,我猜是因为图片正在不断更新。但是在图片之外它仍然不起作用。
【问题讨论】:
-
您似乎没有更新您的窗口。您是否尝试过调用函数“update()”?它是 QOpenGLWidget 的一部分,继承自 QWidget。在您的paintGL() 或您更新程序主循环的任何地方调用该函数。
-
我已经扩展了
QGraphicsView类。在其中,我有一个方法可以检查何时应该擦除绘制的项目(基于视频中的帧)。在那里我试图做viewport()->update()或调用视图的update()但它不起作用。没有openGL,这很好用(即使没有那个电话)。我是否必须扩展QOpenGLWidget并实现我自己的paintGL?似乎不仅我的操作,而且任何意味着删除绘制的项目都不会更新(例如选择矩形)。 -
我添加了一张图片来帮助说明这一点。
-
调用 QOpenGLWidget 的 update() 函数。老实说,您应该绘制一个类图并决定是否要从 QOPenGLWidget 继承。对于它的价值,您将两个渲染 API 混合在一起。在这一点上,您必须问自己是否值得走 OpenGL 的低级车道(根本不是一件坏事)是否值得。为了减少一些 CPU 能力,我说使用图形视图而不是尝试让 GPU 来渲染它。
-
@Poriferous 手动调用
update()的建议是错误的。使用QGraphicsView的全部意义在于这些事情是自动处理的。您关于“混合”两个渲染 API 的评论也是错误的 - Qt 完全支持在 OpenGL 上下文中使用QPainter。这应该可以工作,而且确实可以与旧的QGLWidget一起工作。
标签: c++ qt opengl qgraphicsview