我有一个带有QWidget的gui (具体来说,是一个QwtPlot,但我不认为问题是Qwt-specific),我用计时器重新绘制它。也就是说,每100毫秒的QWidget::update就会通过QwtPlot::replot被呼叫。当计时器间隔太小或QwtCurve (QPolygonF)中的样本数太大时,程序会崩溃,通常带有如下错误消息:
QWidget::重新绘制:检测到递归重绘 QPainter::开始:一次只能由一个画家画一个油漆装置。 QPainter::翻译:画家不活跃 QPainter::开始:一次只能由一个画家画一个油漆装置。 QPainter::保存:画家不活动 QPainter::setClipRect:画家不活动 QPainter::保存:画家不活动 QPainter::setRenderHint:画家必须主动设置呈现提示 QPainter::setRenderHint:画家必须主动设置呈现提示 QPainter::还原:不平衡保存/恢复 QPainter::保存:画家不活动 QPainter::setRenderHint:画家必须主动设置呈现提示 QPainter::setRenderHint:画家必须主动设置呈现提示 QPainter::保存:画家不活动 QPainter::setPen:画家不活跃 画家::钢笔:画家不活跃 QPainter::还原:不平衡保存/恢复 QPainter::还原:不平衡保存/恢复 QPainter:拯救:画家不活跃.
“递归重绘”错误的标准原因是如果您在update中调用update或类似的东西,但是我没有对QWidget进行子类,所以在我的代码中从未发生过这种情况。Qwt已经存在了足够长的时间,所以我非常肯定,在代码中没有出现这样的基本错误。这让我想到,update是在上次抽签结束之前被调用的,这就引出了我的问题:是否有一种方法可以确定重绘是否完成,因此,如果最后一次重绘在计时器再次启动时尚未完成,那么跳过给定的重绘吗?
编辑:我使用计时器,因为生成要绘制的数据的计算是在工作线程中完成的。对于这个信号,我使用一个Qt::BlockingQueuedConnection,并保证只从主线程调用重绘的assert()。这就是为什么我不使用QwtPlot的自动重绘功能,如果我尝试,程序就会崩溃。
发布于 2014-08-11 05:30:54
正如Chris所说,update()调用不应导致任何问题。
通过应用程序中的qInstallMsgHandler()安装自定义消息处理程序可能会有所帮助。这样,您就可以在出现警告时获得一个断点,并检查这种情况发生的确切时间/原因。
https://stackoverflow.com/questions/25235170
复制相似问题