我有一个大而复杂的图形视图,需要进行大量处理才能绘制,因此我只想在每帧重绘其中的一部分(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 内容不显示。