【发布时间】:2014-10-03 19:16:15
【问题描述】:
我有一个带有QWidget(特别是QwtPlot,但我不认为问题出在Qwt-特定)的gui,我使用计时器重绘了它。即,每 100 毫秒 QWidget::update 被通过 QwtPlot::replot 调用。当定时器间隔太小,或者QwtCurve(QPolygonF)中的样本数量太大时,程序会崩溃,通常会出现这样的错误信息:
QWidget::repaint:检测到递归重绘
QPainter::begin:一个绘画设备一次只能由一个画家绘画。
QPainter::translate: Painter 未激活
QPainter::begin:一个绘画设备一次只能由一个画家绘画。
QPainter::save: Painter 未激活
QPainter::setClipRect: Painter 未激活
QPainter::save: Painter 未激活
QPainter::setRenderHint:Painter 必须处于活动状态才能设置渲染提示
QPainter::setRenderHint:Painter 必须处于活动状态才能设置渲染提示
QPainter::restore:不平衡的保存/恢复
QPainter::save: Painter 未激活
QPainter::setRenderHint:Painter 必须处于活动状态才能设置渲染提示
QPainter::setRenderHint:Painter 必须处于活动状态才能设置渲染提示
QPainter::save: Painter 未激活
QPainter::setPen: Painter 未激活
QPainter::Pen:Painter 未激活
QPainter::restore:不平衡的保存/恢复
QPainter::restore:不平衡的保存/恢复
QPainter::save: Painter 未激活 ...
“递归重绘”错误的标准原因是,如果您在 update 内调用 paint() 或类似的东西,但我没有继承 QWidget,所以这在我的代码中永远不会发生。 Qwt 已经存在了足够长的时间,我很确定该代码中不存在诸如此类的基本错误。这让我认为update 在最后一次抽签完成之前被调用,这让我想到了我的问题:有没有办法确定重绘是否完成,因此,如果最后一个还没有完成,则跳过给定的重绘计时器再次触发时还没有完成?
编辑:我使用计时器,因为生成要绘制的数据的计算是在工作线程中完成的。我为此信号使用Qt::BlockingQueuedConnection,并使用assert() 保证仅从主线程调用replot。这就是为什么我不使用QwtPlot 的自动重绘功能的原因,如果我尝试,程序会崩溃。
【问题讨论】:
-
update() 函数始终可以安全调用。只有直接调用 repaint() 时才会遇到这样的问题。
-
为什么叫更新?
QwtPlot数据中的更改应该自动执行此操作(正确的视图和模型行为 - 您的代码是控制器)。 -
@MarekR 请查看我的编辑。
setAutoReplot(true)在我的情况下不起作用。
标签: c++ qt repaint qpainter qwt