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

3

这个问题在结尾处以加粗字体标出,请整体阅读。

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

正如您所看到的,这里涉及到一个“缓慢”的函数来将东西呈现为 pixmap。
问题是:当我调整窗口大小时,我可以看到尚未重新绘制的区域中会出现白色闪烁。
我知道在视口重新绘制之前无法避免白色区域,但我想立即用背景颜色绘制该白色区域。
因此,问题来了:我能否在重型 pixmap 渲染之前立即显示背景颜色
我似乎找不到实现这一点的方法...似乎所有的图形操作都被缓冲,然后立即位块传输到屏幕上。我正在使用 Windows 8.1 x64 和 Qt5。有没有办法立即绘制背景颜色,然后继续进行其他渲染?

最好的解决方案是将昂贵的渲染从paintEvent()中移出,可能移到另一个线程中。无论如何,您都需要缓存已渲染的像素图。仅在真正需要更新该像素图时才进行更新,然后调用update()来触发重绘。 - Frank Osterfeld
谢谢Frank。我用你的建议解决了。把它变成一个答案,我会接受它。 - Albert
有一个类似(但有点不同)的问题 https://dev59.com/Db7pa4cB1Zd3GeqP5cIh?fbclid=IwAR2mP03AR9tV0llEme7Hd9UpcraWL9DNnsKuYBA25kHwCx914XcjpETtZHU - HiFile.app - best file manager
1个回答

3

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


感谢。下一个问题的提示:http://stackoverflow.com/q/30422774/4715851 - Albert
这对我的情况没有帮助。我使用标准的Qt小部件也会出现闪烁问题。 - HiFile.app - best file manager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接