У меня есть фоновый поток, и этот поток вызывает некоторые методы, которые обновляют пользовательский интерфейс (для отображения индикаторов выполнения и дополнительной информации в текстовых областях).
Если я изменяю некоторые значения виджета пользовательского интерфейса, возникает ошибка «Невозможно отправить события объектам, принадлежащим другому потоку».
Просматривая форумы, я прочитал, что могу использовать метод QMetaObject :: invokeMethod, но он просто работает, если я передаю ему флаг Qt :: DirectConnection, который фактически вызывает ту же ошибку, показанную выше.
Если я использую Qt :: QueuedConnection или Qt :: AutoConnection, invokeMethod возвращает false.
Мой код выглядит примерно так:
.h:
class A : public QMainWindow
{
Q_OBJECT
QProgressBar* pb;
public slots:
bool m(bool, int);
};
class B
{
A* a;
public:
void handleEvent();
};
.cpp:
bool A::m(bool x, int y)
{
pb->setValue(y);
return x;
}
void B::handleEvent()
{
//a->m(true, 12); //raises an assertion error
bool r;
//bool ret = QMetaObject::invokeMethod(a, "m", Qt::DirectConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //raises the same assertion error error
bool ret = QMetaObject::invokeMethod(a, "m", Qt::AutoConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //is ignored and ret contains false.
}
Вы знаете, что происходит или что я делаю неправильно? или, может быть, кто-то может предложить мне другой подход к решению моей проблемы новичка?
Заранее спасибо,
Эрнесто