2017-09-22 66 views
1

我用C++創建了兩個QML插件。插件A代表一些特定的UI項目類型,插件B代表自己的「存儲」單例QML項目類型。最初的動機是創建QML存儲單例,並通過大多數QML UI代碼使用它。現在我也想要A和B之間的直接交互,這意味着它們僅僅在C++代碼中繞過QML而彼此交互。只有A需要了解B,而不是相反。我怎樣才能做到這一點?以C++對象的形式訪問QML插件代碼

rootObject->findChild需要的解決方案類型。這個問題有點類似於Accessing QML objects from C++,除了我需要能夠從C++中的QML PlugIn動態庫實例化對象。我看到使用QML和C++代碼的動態庫的表面解決方案。但它有點複雜:它只能是一個帶有數據的代碼實例。也有可能以某種方式將插件對象的QML實例「轉換」爲普通的Qt插件,然後調用我想要的任何東西。

回答

1

我認爲這也應該適用於插件,而不僅僅適用於註冊類型。我不能嘗試它,現在,當我嘗試過了那天晚些時候我會刪除此行:

每個QML辛格爾頓,C++定義需要有簽名的靜態方法:

static QObject* someName(QQmlEngine *, QJSEngine *); 

返回一個指向這個類的單個實例的指針。

我通常會認爲你不需要QQmlEngineQJSEngine,使其工作,所以你可以很容易地通過添加第二個靜態方法實現完整的單例模式:

static QObject* instance(); 

返回一模一樣。 你可能會有一個

static MySingletonObject* instance(); 

所以你不需要後來施放。

現在您只需導入您的類,並且您將通過調用此靜態方法訪問同一個實例。


如果以上不工作,你可能會做它的哈克的方式:

您也可以使用您的根節點,並設置一個屬性:

property QtObject mySingleton: MySingleton 

然後你可以使用findChild來獲取您的根節點並閱讀相同的屬性。爲了能夠做到這一點,你可能需要先訪問單例的東西,否則實例可能會丟失。

property Item singl: MySingleton 

Component.onCompleted: { 
    // MySingleton.color = 'green' // If this line is commented out, it will fail for me for a QML-defined Singleton at least. 
    singl.color = 'red' 
} 

該解決方案適用於我QML定義qmldir註冊的單身人士,以及C++ - 定義和qmlRegisterSingleton(...) - 註冊單身。使用QML定義的單例,您可能需要訪問單例,然後才能分配它。我不知道這個的內部原因。

+0

您的方法是合乎邏輯的,但我無法解析GCC運行時錯誤「未定義符號_ZNK9MyQmlType10metaObjectEv」。因此,除非插件動態庫已經被加載,否則插件加載似乎沒有辦法。 'qmlRegister *'函數不能註冊類型,而不實現可訪問的類型類型。 – AlexanderVX

+0

你採取哪種方法?你能創建一個MCVE嗎? – derM

+0

我決定使用https://stackoverflow.com/questions/28112038/qml-plugin-load-from-c來解決這個我並不真正想要的解決方法,但至少這是可行的。 – AlexanderVX