我的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 );
}
这会导致运行时错误:
QWidget::重新绘制:检测到递归重新绘制
我发现了这个https://qt-project.org/forums/viewthread/24921但我不太明白为什么从另一个线程设置栏小部件值是非法的。
谢谢!
您不应该直接从主线程以外的线程访问小部件和GUI相关的东西。此外,直接从其他线程中的对象调用函数是非法的,会导致崩溃和未定义的行为。
更新进度条的正确方法是使用信号槽机制。只需将线程中的信号连接到小部件的插槽即可更新进度条。每次想要设置新值时,只需发出信号即可。该信号还可以有一个包含进度百分比的参数。