我有一个gui QWidget
(具体来说,QwtPlot
,但我不认为问题是Qwt
- 具体的)我使用计时器重绘。即,通过QWidget::update
每100ms QwtPlot::replot
被调用一次。当定时器间隔太小或QwtCurve
(QPolygonF
)中的样本数太大时,程序崩溃,通常会出现如下错误消息:
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
的自动绘图功能,如果我尝试,程序将崩溃。
答案 0 :(得分:0)
正如Chris所说,update()调用不应该导致任何问题。
在应用程序中通过qInstallMsgHandler()安装自定义消息处理程序可能会有所帮助。通过这种方式,您可以在出现警告时获得断点,并查看何时/为何确实发生这种情况。