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

标签 c++ multithreading qt

我的 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: Recursive repaint detected

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

谢谢!

最佳答案

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

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

关于c++ - QWidget::repaint:更新进度条时检测到递归重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25733142/

相关文章:

java - 未抛出 ClosedByInterruptException

java - 如果 synchronized 创建一个 happen-before 关系并防止重新排序,为什么 DCL 需要 volatile

c++ - 包含源中的 Qt undefined reference

c++ - 在 qt 应用程序内执行 qt 应用程序

c++ - 求图形显示/C++中(头文件)文件依赖关系的工具

c++ - 访问器应该返回值还是常量引用?

C++ 为什么我的代码将注册表项放在错误的目录中?

c++ - QLabel 未从插槽调用更新

c# - 用于大量、低延迟 http 请求的异步与线程

c++ - 如何在具有纯C++环境的Qt中使用图像?