我怎么等到QWidget :: repaint完成?

时间:2014-08-11 02:35:33

标签: c++ qt repaint qpainter qwt

我有一个gui QWidget(具体来说,QwtPlot,但我不认为问题是Qwt - 具体的)我使用计时器重绘。即,通过QWidget::update每100ms QwtPlot::replot被调用一次。当定时器间隔太小或QwtCurveQPolygonF)中的样本数太大时,程序崩溃,通常会出现如下错误消息:

  

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

     

QPainter :: begin:绘画设备一次只能由一位画家绘画。

     

QPainter :: translate:画家不活跃

     

QPainter :: begin:绘画设备一次只能由一位画家绘画。

     

QPainter :: save:画家不活跃

     

QPainter :: setClipRect:画家不活跃

     

QPainter :: save:画家不活跃

     

QPainter :: setRenderHint:画家必须处于活动状态才能设置渲染提示

     

QPainter :: setRenderHint:画家必须处于活动状态才能设置渲染提示

     

QPainter :: restore:不平衡保存/恢复

     

QPainter :: save:画家不活跃

     

QPainter :: setRenderHint:画家必须处于活动状态才能设置渲染提示

     

QPainter :: setRenderHint:画家必须处于活动状态才能设置渲染提示

     

QPainter :: save:画家不活跃

     

QPainter :: setPen:画家不活跃

     

QPainter :: Pen:画家不活跃

     

QPainter :: restore:不平衡保存/恢复

     

QPainter :: restore:不平衡保存/恢复

     

QPainter :: save:画家不活跃......

“递归重绘”错误的标准原因是,如果您在paint()内调用update或类似的内容,但我不是QWidget的子类,所以这在我的代码中永远不会发生。 Qwt已经存在了很长时间,以至于我很确定该代码中不存在这样的基本错误。这让我想到update在最后一次抽奖结束之前被调用了,这引出了我的问题:有没有办法找出重绘是否完整,所以,如果最后一个,请跳过给定的重绘当计时器再次发射时,还没有完成?

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

1 个答案:

答案 0 :(得分:0)

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

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