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

use*_*577 9 c++ qt multithreading

我的Qt应用程序有多个线程.其中一个叫ui->SyncUI(),和ui的对象在哪里class 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 );
}
Run Code Online (Sandbox Code Playgroud)

这会导致运行时错误:

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

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

谢谢!

Nej*_*jat 13

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

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