我有一个庞大而复杂的图形视图,需要进行大量的处理才能绘制,所以我只希望每帧重绘一部分(一个OpenGL视频显示),其余部分(各种子窗口小部件等)保持不变。
但是,当我使用QRegion调用update()时,paintEvent的区域是小部件的完整大小,因此每次都会重绘整个屏幕。似乎没有任何调用update()没有参数(至少不是我的版本)
什么可能导致paint事件中出现全屏?
void GLGraphicsView::updateVideoRegion(const QRegion & r)
{
//this function called from outside...
LOG4CXX_DEBUG(_logger, "updateVideoRegion " << r.boundingRect().x() << " " << r.boundingRect().y() << " " << r.boundingRect().width() << " " << r.boundingRect().height());
update(r);
}
void GLGraphicsView::update()
{
LOG4CXX_DEBUG(_logger, "update(all)");
QGraphicsView::update();
}
void GLGraphicsView::update(const QRegion& region)
{
LOG4CXX_DEBUG(_logger, "update(region) " << region.boundingRect().x() << " " << region.boundingRect().y() << " " << region.boundingRect().width() << " " << region.boundingRect().height());
QGraphicsView::update(region);
}
void GLGraphicsView::paintEvent(QPaintEvent *e)
{
LOG4CXX_DEBUG(_logger, "repaint region " << e->region().boundingRect().x() << " " << e->region().boundingRect().y() << " " << e->region().boundingRect().width() << " " << e->region().boundingRect().height());
/* Do the rest of the painting */
}
输出:
updateVideoRegion 19 19 1446 568
update(region) 19 19 1446 568
repaint region 0 0 1920 1201
编辑:
我还尝试使用updateScene(QList)而不是update(QRegion),并将viewportUpdateMode设置为SmartViewportUpdate,但paintEvent的区域仍然是屏幕的完整大小。 CacheMode设置为CacheNone,并将其设置为CacheBackground会导致OpenGL内容无法显示。
答案 0 :(得分:0)
经过进一步调查后,看来这是因为我使用的是OpenGL - &#39; fullUpdate&#39;在这种情况下总是设置updateScene中的标志 - qgraphicsView具有&#34; accelerateScrolling =!isGlWidget&#34; [在setupViewport,第2759行]和&#34; fullUpdate =!d-&gt; accelerateScrolling&#34; [在updateScene,第2675行]