我如何等待直到QWidget::repaint完成
How do I wait until QWidget::repaint is finished?
我有一个gui与QWidget
(具体来说,一个QwtPlot
,但我不认为问题是Qwt
特定),我使用计时器重新绘制。也就是说,通过QwtPlot::replot
,每100毫秒调用一次QWidget::update
。当定时器间隔太小,或者QwtCurve
(QPolygonF
)中的样本数量太大时,程序崩溃,通常显示如下错误消息:
QWidget::repaint:检测到递归重绘
QPainter::begin:一个绘画装置一次只能由一个画家绘制。
QPainter::translate: Painter未激活
QPainter::begin:一个绘画装置一次只能由一个画家绘制。
QPainter::save: Painter未激活
QPainter::setClipRect: Painter not active
QPainter::save: Painter未激活
QPainter::setRenderHint: Painter必须激活以设置渲染提示
QPainter::setRenderHint: Painter必须激活以设置渲染提示
QPainter::restore: balanced save/restore
QPainter::save: Painter未激活
QPainter::setRenderHint: Painter必须激活以设置渲染提示
QPainter::setRenderHint: Painter必须激活以设置渲染提示
QPainter::save: Painter未激活
QPainter::setPen: Painter未激活
QPainter::Pen: Painter未激活
QPainter::restore: balanced save/restore
QPainter::restore: balanced save/restore
QPainter::save: Painter not active…
"递归重绘"错误的标准原因是,如果你在update
或类似的东西中调用paint()
,但我没有子类化QWidget
,所以这永远不会发生在我的代码中。Qwt
已经存在了足够长的时间,我很确定在该代码中没有像这样的基本错误。这让我认为update
在最后一次绘制完成之前被调用,这导致了我的问题:是否有一种方法可以找出重新绘制是否完成,因此,如果最后一个在计时器再次触发时尚未完成,则跳过给定的重新绘制?
Qt::BlockingQueuedConnection
,并使用assert()
保证replot只从主线程调用。这就是为什么我不使用QwtPlot
的自动重绘功能,如果我尝试,程序会崩溃。
正如Chris所说,update()调用不应该引起任何问题。
在应用程序中通过qInstallMsgHandler()安装自定义消息处理程序可能会有所帮助。通过这种方式,您可以在出现警告时获得断点,并检查何时/为什么会发生这种情况。
- 如何在QT Creator上将QWidget声明为继承类的对象
- QWidget::p aintEngine:不应再在 QTreeWidget 派生类中调用
- 将一个 QWidget 链接到另一个新创建的 QWidget
- 为什么 isVisible 在 QWidget 孩子中不起作用
- 如何声明全局QWidget?
- QWidget UI 在使用 QQuickWidget 时冻结
- "(QWidget* pobj=0)"和"(QWidget* pwgt/*=0/)&quo
- qt QWidget::closeEvent link issue
- 如何在QMdiSubWindow关闭后删除QWidget
- 如何在QGraphicsView中移动QWidget?
- QPainter的QWidget滚动条
- 在类中创建 QWidget
- 在另一个小部件中更改QWidget的背景颜色
- 使用 QMediaPlayer 时出现"QWidget::paintEngine: Should no longer be called"
- QWidget收听其他QWidgets事件
- 为提升的小部件设置父 QWidget
- 如何制作可以缩放和绘制的画布QWidget?
- 调用qwidget::repaint()时崩溃
- 我如何等待直到QWidget::repaint完成
- QWidget::repaint:使用指针检测到递归重绘