Qt - 调整大小时避免白色背景(立即设置背景颜色)
Qt - avoid white background when resizing (set immediately a background color)
问题在最后以粗体显示,请通读。
我有一个 QAbstractScrollArea
小部件,我在 OnPaint() 事件中手动完全渲染它。
在它的构造函数中我设置了
setAttribute( Qt::WA_OpaquePaintEvent, true );
setAttribute( Qt::WA_NoSystemBackground, true );
setStyleSheet( "QWidget { background-color: rgb(0,0,77); }" );
绘画事件看起来像这样:
void MyArea::paintEvent (QPaintEvent *event) {
QPainter view(viewport());
view.fillRect(rect(), backgroundBrush);
renderedPixmap = heavyAndSlowRenderingOnAPixmap();
view.drawPixmap(viewRect, renderedPixmap, pixmapRect);
}
如您所见,有一个 "slow" 函数用于将内容渲染到像素图中。
问题是:当我调整 window 的大小时,我可以看到在尚未重绘的区域有片刻的白色闪烁
我知道在重新绘制视口之前我无法避开白色区域,但是我想立即用背景颜色绘制那个白色区域。
所以问题来了:我可以在重像素图渲染之前立即显示背景色吗?
我似乎找不到实现此目的的方法.. 似乎所有图形操作都经过缓冲,然后立即一起位块传输到屏幕上。我正在使用 Windows 8.1 x64 和 Qt5。有什么方法可以立即绘制背景颜色,然后继续进行其余的渲染?
最好的解决方案是将昂贵的渲染从 paintEvent() 中移出,可能转移到另一个线程中。无论如何,您都希望缓存渲染的像素图。在真正需要时更新该像素图,然后调用 update() 触发重绘。
问题在最后以粗体显示,请通读。
我有一个 QAbstractScrollArea
小部件,我在 OnPaint() 事件中手动完全渲染它。
在它的构造函数中我设置了
setAttribute( Qt::WA_OpaquePaintEvent, true );
setAttribute( Qt::WA_NoSystemBackground, true );
setStyleSheet( "QWidget { background-color: rgb(0,0,77); }" );
绘画事件看起来像这样:
void MyArea::paintEvent (QPaintEvent *event) {
QPainter view(viewport());
view.fillRect(rect(), backgroundBrush);
renderedPixmap = heavyAndSlowRenderingOnAPixmap();
view.drawPixmap(viewRect, renderedPixmap, pixmapRect);
}
如您所见,有一个 "slow" 函数用于将内容渲染到像素图中。
问题是:当我调整 window 的大小时,我可以看到在尚未重绘的区域有片刻的白色闪烁
我知道在重新绘制视口之前我无法避开白色区域,但是我想立即用背景颜色绘制那个白色区域。
所以问题来了:我可以在重像素图渲染之前立即显示背景色吗?
我似乎找不到实现此目的的方法.. 似乎所有图形操作都经过缓冲,然后立即一起位块传输到屏幕上。我正在使用 Windows 8.1 x64 和 Qt5。有什么方法可以立即绘制背景颜色,然后继续进行其余的渲染?
最好的解决方案是将昂贵的渲染从 paintEvent() 中移出,可能转移到另一个线程中。无论如何,您都希望缓存渲染的像素图。在真正需要时更新该像素图,然后调用 update() 触发重绘。