QWidget:: repaint: рекурсивная перерисовка обнаружена при обновлении индикатора выполнения

мое приложение 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:: repaint: обнаружена рекурсивная перекраска

Я нашел это https://qt-project.org/forums/viewthread/24921 но я не совсем понимаю, почему установка значения виджета бара из потока anther является незаконной.

спасибо!

1 ответов


вы никогда не должны получать доступ к виджетам и связанным с GUI вещам непосредственно из потока, отличного от основного потока. Также вызов функций из объекта в другом потоке напрямую является незаконным и приводит к сбоям и неопределенному поведению.

правильный способ обновления индикатора выполнения - использование механизма слота сигнала. Просто подключите сигнал из потока к слоту вашего виджета, который обновляет индикатор выполнения. Каждый раз, когда вы хотите установить новое значение, просто излучают сигнал. Сигнал может также иметь аргумент, содержащий процент прогресса.