[英]qml c++ property bindings with multiple threads
我正在創建一個模塊化應用程序 它有一個Core
和一些模塊,其中有一個gui模塊。 可以通過命令行啟動這些模塊:
myApp gui=qml=qmlFile.qml connection=serial=/dev/ttyS1
將使用一個(多個也可能)gui和一個串行連接啟動應用程序。 總有一個Router
對象處理連接。 Guis由一個看起來像這樣的類加載:
class Gui :QObject{
Core* core;
public:
QQmlApplicationEngine engine;
public slots:
void start(){
engine.load("qrc:/gui/from/command/line.qml");
}
在gui中我有一個很好的qml名為ConnectionController{}
,這是一種添加/刪除連接的簡單方法。 但這只是它的第一種:最終每個模塊都應該有一個用於控制它的qml組件。
這一切都很好,但現在我想添加多個線程。 我想要一個RouterThread
和一個GuiThread
。 這本身只是將Router
(由Core
)的創建更改為:
m_router = new Router(this /*not as parent, just as pointer*/);
m_router->moveToThread(&routerThread);
(gui現在仍然存在於主線程中)此后一切仍然正常,除了qml屬性綁定。
QQmlEngine: Illegal attempt to connect to SerialConnection(0x7f58d00013a0) that is in a different thread than the QML engine
因為Gui
和它的孩子QQmlEngine engine
生活在guiThread
而SerialConnection
生活在routerThread
。
Router
和Gui
(沒有qml)之間的信號和插槽確實有效,因為默認情況下它們被qt處理為異步。 (只要定義了適當的類型。)
好吧,不,你不能從你的gui訪問線程對象,不應該嘗試。
您需要構建一個c ++模型,該模型位於暴露給qml的主線程中。 在此模型中,您可以通過排隊連接連接線程發出的信號,並將它們鏈接到模型自身的信號。 此外,您應該確保當您從另一個線程擁有的對象讀取數據時,所有內容都是正確的互斥或您將閱讀垃圾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.