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

标签 c++ windows qt paint qscrollarea

问题在末尾以粗体显示,因此请通读整篇文章。

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

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

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

enter image description here

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

所以问题来了:我能否在重像素图渲染之前立即显示背景色

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

最佳答案

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

关于c++ - Qt - 调整大小时避免白色背景(立即设置背景色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415236/

相关文章:

c++ - 如何在不同的定义时间为每个触发器设置数万个任务?

c++ - 如何访问远程系统的COM口?

windows - 使用WINAPI找出特殊文件上的进程事件句柄(锁定)

c++ - 包含标题中的结构

c++ - 移植到 Qt5 后 OpenGL 应用程序看起来很奇怪

c++ - Qt - 有没有办法检查窗口是否标记为始终在最前面(linux)?

java - 为竞技场 gui 编写国际象棋引擎

c++ - 将一张 map 复制到另一张 map

c++ - 彭博 API : field not permitted to datafeed users

c - DLL 中的函数未返回正确值