我有一個後臺線程和線程調用更新UI的一些方法(以顯示進度條並顯示文本區域中的其他信息)。Qt:後臺線程刷新UI線程
如果我修改了某些UI小部件值,則會發出「無法將事件發送給由不同線程擁有的對象」斷言錯誤。
看看論壇,我讀到我可以使用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.
}
你知道是怎麼回事,或者我做錯了嗎?或者,也許,有人可以建議我另一種方法來處理我的新手問題?
由於提前,
埃內斯托