我如何等待直到QWidget::repaint完成

How do I wait until QWidget::repaint is finished?

本文关键字:QWidget repaint 完成 何等待 等待      更新时间:2023-10-16

我有一个gui与QWidget(具体来说,一个QwtPlot,但我不认为问题是Qwt特定),我使用计时器重新绘制。也就是说,通过QwtPlot::replot,每100毫秒调用一次QWidget::update。当定时器间隔太小,或者QwtCurve (QPolygonF)中的样本数量太大时,程序崩溃,通常显示如下错误消息:

QWidget::repaint:检测到递归重绘

QPainter::begin:一个绘画装置一次只能由一个画家绘制。

QPainter::translate: Painter未激活

QPainter::begin:一个绘画装置一次只能由一个画家绘制。

QPainter::save: Painter未激活

QPainter::setClipRect: Painter not active

QPainter::save: Painter未激活

QPainter::setRenderHint: Painter必须激活以设置渲染提示

QPainter::setRenderHint: Painter必须激活以设置渲染提示

QPainter::restore: balanced save/restore

QPainter::save: Painter未激活

QPainter::setRenderHint: Painter必须激活以设置渲染提示

QPainter::setRenderHint: Painter必须激活以设置渲染提示

QPainter::save: Painter未激活

QPainter::setPen: Painter未激活

QPainter::Pen: Painter未激活

QPainter::restore: balanced save/restore

QPainter::restore: balanced save/restore

QPainter::save: Painter not active…

"递归重绘"错误的标准原因是,如果你在update或类似的东西中调用paint(),但我没有子类化QWidget,所以这永远不会发生在我的代码中。Qwt已经存在了足够长的时间,我很确定在该代码中没有像这样的基本错误。这让我认为update在最后一次绘制完成之前被调用,这导致了我的问题:是否有一种方法可以找出重新绘制是否完成,因此,如果最后一个在计时器再次触发时尚未完成,则跳过给定的重新绘制?

编辑:我使用计时器,因为生成要绘制的数据的计算是在工作线程中完成的。对于这个信号,我使用Qt::BlockingQueuedConnection,并使用assert()保证replot只从主线程调用。这就是为什么我不使用QwtPlot的自动重绘功能,如果我尝试,程序会崩溃。

正如Chris所说,update()调用不应该引起任何问题。

在应用程序中通过qInstallMsgHandler()安装自定义消息处理程序可能会有所帮助。通过这种方式,您可以在出现警告时获得断点,并检查何时/为什么会发生这种情况。