为什么QGraphicsView :: update(const QRegion&)导致整个小部件更新?

时间:2015-12-21 17:02:21

标签: c++ qt

我有一个庞大而复杂的图形视图,需要进行大量的处理才能绘制,所以我只希望每帧重绘一部分(一个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内容无法显示。

1 个答案:

答案 0 :(得分:0)

经过进一步调查后,看来这是因为我使用的是OpenGL - &#39; fullUpdate&#39;在这种情况下总是设置updateScene中的标志 - qgraphicsView具有&#34; accelerateScrolling =!isGlWidget&#34; [在setupViewport,第2759行]和&#34; fullUpdate =!d-&gt; accelerateScrolling&#34; [在updateScene,第2675行]