QWidget::repaint:更新进度条时检测到递归重绘

Posted

技术标签:

【中文标题】QWidget::repaint:更新进度条时检测到递归重绘【英文标题】:QWidget::repaint: Recursive repaint detected when updating progress bar 【发布时间】:2014-09-08 21:06:38 【问题描述】:

我的 Qt 应用程序有多个线程。其中一个调用ui->SyncUI(),其中uiclass Interface : public QMainWindow 的对象并且

void Interface::SyncUI() 
QWidget* bar_widget = ui.tableWidget->cellWidget(0,4);
QProgressBar* bar_widget2 = dynamic_cast <QProgressBar*> (bar_widget);
bar_widget2->setValue( (int)percentage );

这会导致运行时错误:

QWidget::repaint:检测到递归重绘

我发现了这个 https://qt-project.org/forums/viewthread/24921 但我不太明白为什么从另一个线程设置 bar 小部件值是非法的。

谢谢!

【问题讨论】:

Although QObject is reentrant, the GUI classes, notably QWidget and all its subclasses, are not reentrant. They can only be used from the main thread. 【参考方案1】:

您不应该直接从主线程以外的线程访问小部件和 GUI 相关的东西。直接从另一个线程中的对象调用函数也是非法的,并导致崩溃和未定义的行为。

更新进度条的正确方法是使用信号槽机制。只需将来自线程的信号连接到小部件的插槽即可更新进度条。每次你想设置一个新值时,只需发出信号。该信号还可以有一个包含进度百分比的参数。

【讨论】:

以上是关于QWidget::repaint:更新进度条时检测到递归重绘的主要内容,如果未能解决你的问题,请参考以下文章

QWidget::repaint: Recursive repaint detected

Qt 在处理时更新(重绘)文本框

显示进度条时如何暂停 Selenium 执行

如何在显示firebase数据获取的进度条时通过startListening()解决错误? [重复]

在浏览文件或网页时,滑动滚动条时页面跳跃抖动,这是啥原因?

将数据插入本地数据库时,Android ProgressBar 不更新