我是Qt
的新手。我有一個工作線程,它是一個std::thread
。工作線程函數不斷地在循環中獲取一些數據。數據的大小經常在QML
UI上的Text
元素上更新。我有一個監聽器回調,它只是一個std::function
,它從thread's function
被調用。它向我發送回調,我根據該回調更新了Text
元素QML
。我使用signal slot
機制更新它。從工作線程發出Qt ::信號默認情況下會在主線程上更新UI?
以下是QML : Text
元件:
Text {
id: mytext
objectName: "mytextobject"
function slotUpdateData(someValue){
mytext = someValue
}
}
SignalUpdateData
與slotUpdateData
駐留上QML
側連接。每次我從std::thread
,I emit SignalUpdateData
獲取數據事件回調時,都會更新QML Text element
,UI
。
void CallBackReceivedFromWorkerThread(float someValue) {
emit SignalUpdateData(someValue)
}
以下是我如何完成主機連接C++ signal
與QML slot
QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
而這一切工作正常。沒有崩潰,鎖定,什麼都沒有。
根據我的理解,由於工作線程的函數正在觸發回調,執行控制在收到回調時位於工作線程上。所以在做emit SignalUpdateData(someValue)
時,我們仍然在工作線程上。 據我在android
& java
我以前的經驗知道,我們不能從應用程序的main thread
以外的任何地方更新UI。
那麼,這是如何工作的? emit SignalUpdateData(someValue)
是否打電話給main UI thread's event loop
?儘管我從worker thread
撥打電話,Qt
仍然在main thread
上更改用戶界面?如果我的方法很好,那麼它是否會影響性能?最好的建議是什麼?
我想很肯定這個&不只是幸運的做到這一點。我是否也應該使用Qt::Connection_enum以獲得最佳方法?
據我所知(可能是錯誤的),一切QML發生在主/ gui線程上。 –