【问题标题】:How do I wait until QWidget::repaint is finished?我如何等到 QWidget::repaint 完成?
【发布时间】:2014-10-03 19:16:15
【问题描述】:

我有一个带有QWidget(特别是QwtPlot,但我不认为问题出在Qwt-特定)的gui,我使用计时器重绘了它。即,每 100 毫秒 QWidget::update 被通过 QwtPlot::replot 调用。当定时器间隔太小,或者QwtCurveQPolygonF)中的样本数量太大时,程序会崩溃,通常会出现这样的错误信息:

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,虽然这应该是评论而不是答案。我试过这个,但我没有从调试模式下运行的调试器中得到任何有用的东西。
猜你喜欢
  • 1970-01-01
  • 2015-07-02
  • 2011-06-03
  • 2019-05-11
  • 2016-06-17
  • 2012-05-18
  • 2013-01-28
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多