Qt - 调整大小时避免白色背景(立即设置背景颜色)

Posted

技术标签:

【中文标题】Qt - 调整大小时避免白色背景(立即设置背景颜色)【英文标题】:Qt - avoid white background when resizing (set immediately a background color) 【发布时间】:2015-05-23 16:50:08 【问题描述】:

问题最后以粗体显示,因此请整体阅读。

我有一个 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);

如您所见,将内容渲染到像素图中涉及到一个“慢速”函数。

问题是:当我调整窗口大小时,我可以在尚未重绘的区域看到片刻白色闪烁

我知道在重绘视口之前我无法避开白色区域,但是我想立即用背景颜色绘制那个白色区域

那么问题来了:我可以在重像素图渲染之前立即显示背景颜色吗

我似乎无法找到实现这一点的方法.. 似乎所有图形操作都被缓冲,然后立即一起位块传输到屏幕上。我正在使用 Windows 8.1 x64 和 Qt5。有什么方法可以立即绘制背景颜色,然后继续进行其余的渲染?

【问题讨论】:

最好的解决方案是将昂贵的渲染移出paintEvent(),可能会移到另一个线程中。无论如何,您都需要缓存渲染的像素图。在真正需要时更新该像素图,然后调用 update() 来触发重绘。 谢谢弗兰克。我用你的建议解决了。让它成为一个答案,我会接受它。 有一个类似(但有点不同)的问题***.com/questions/65442009/… 【参考方案1】:

最好的解决方案是将昂贵的渲染移出paintEvent(),可能会移到另一个线程中。无论如何,您都需要缓存渲染的像素图。在真正需要时更新该像素图,然后调用 update() 来触发重绘。

【讨论】:

谢谢。也是下一个问题的提示;)***.com/q/30422774/4715851 这对我没有帮助。我在使用标准 Qt 小部件时也会遇到闪烁。

以上是关于Qt - 调整大小时避免白色背景(立即设置背景颜色)的主要内容,如果未能解决你的问题,请参考以下文章

QT QPushButton背景颜色设置问题

IDEA中怎么设置黑色或白色背景

Qt中progressbar进度的颜色和背景色怎么设置

Qt:无法正确设置qComboBox的背景颜色

photoshop 设置前背景的颜色为白色,如何将背景色指定为白色

pandas绘图设置背景