我認爲這也應該適用於插件,而不僅僅適用於註冊類型。我不能嘗試它,現在,當我嘗試過了那天晚些時候我會刪除此行:
每個QML辛格爾頓,C++定義需要有簽名的靜態方法:
static QObject* someName(QQmlEngine *, QJSEngine *);
返回一個指向這個類的單個實例的指針。
我通常會認爲你不需要QQmlEngine
或QJSEngine
,使其工作,所以你可以很容易地通過添加第二個靜態方法實現完整的單例模式:
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定義的單例,您可能需要訪問單例,然後才能分配它。我不知道這個的內部原因。
您的方法是合乎邏輯的,但我無法解析GCC運行時錯誤「未定義符號_ZNK9MyQmlType10metaObjectEv」。因此,除非插件動態庫已經被加載,否則插件加載似乎沒有辦法。 'qmlRegister *'函數不能註冊類型,而不實現可訪問的類型類型。 – AlexanderVX
你採取哪種方法?你能創建一個MCVE嗎? – derM
我決定使用https://stackoverflow.com/questions/28112038/qml-plugin-load-from-c來解決這個我並不真正想要的解決方法,但至少這是可行的。 – AlexanderVX