1

我有一个大而复杂的图形视图,需要进行大量处理才能绘制,因此我只想在每帧重绘其中的一部分(OpenGL 视频显示),而其余部分(各种子小部件等)保持不变。

但是,当我使用 QRegion 调用 update() 时,paintEvent 的区域是小部件的完整大小,因此每次都会重绘整个屏幕。似乎没有任何不带参数的 update() 调用(至少,不是我的版本)

什么可能导致绘制事件在其中包含全屏?

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 内容不显示。

4

1 回答 1

0

经过进一步调查,这似乎是因为我使用的是 OpenGL - updateScene 中的“fullUpdate”标志在这种情况下始终设置 - qgraphicsView 具有“accelerateScrolling = !isGlWidget”[在 setupViewport,第 2759 行]和“fullUpdate =!d ->accelerateScrolling" [在 updateScene 中,第 2675 行]

于 2016-01-15T14:12:43.527 回答