Спасибо, @vrince, я исправил проблему.Я использовал механизм сигналов / слотов + Qt::QueuedConnection
для связи с GUI
Например, если мне нужно установить текст QLabel
из рабочего потока, я могу сделать в своем рабочем потоке сигнал
void textChanged(QString);
затем я подключаю этот сигнал к слоту QLabel
, используя Qt::QueuedConnection
connect(worker, SIGNAL(textChanged(QString)), label, SLOT(setText(QString), Qt::QueuedConnection);
Если я хочу выполнить setText
синхронно, я могу использовать Qt::BlockingQueuedConnection
теперь в моем рабочем потоке я просто излучаю сигнал:
emit textChanged(newText);
Также возможно использовать функции QMetaObject
, чтобы избежать сигналов и слотов:
metaObject->invokeMethod(label, "setText", Qt::QueuedConnection, Q_ARG(QString, text));