簡體   English   中英

QML:帶有“自帶組件”的 C++ 類

[英]QML: C++ classes with “bring your own component”

我正在嘗試使用 QML 前端開發 Qt C++ 應用程序,但我遇到了障礙。

這是我到目前為止所擁有的:

  • 輸出對象選擇的工廠 class。 這些對象,我將稱之為“控制器”,控制着不同的硬件。
    • 工廠將通過setContextProperty暴露於 QML 層。
    • controller 基本上會選擇帶有控制工廠的組合框。

現在,對於棘手的一點。 我希望“控制器”以“自帶組件”的方式運行。 這意味着他們將有一個方法為他們的 controller 返回相應的 QML 文件。 這應該不難做到,它基本上是讓一個Loader到工廠/管理器的一個方法,說帶有組件的文件加載到一個占位符中。

但問題是:這個新創建的組件和這個新創建的 controller 怎么會互相認識和交談? 這是我以前用 QWidgets 做的事情,只是在類之間有指針。 很瑣碎。

我之前為 QWidgets 嘗試過這樣的架構,但似乎不適用於 QML。

我畫了這張我最終希望發生的事情: 建築理念

這種架構允許一個非常簡單的插件系統(至少在 QWidgets 世界中),我非常想保留它。 不是一個龐大的 singleton 並考慮每一個可能的行動......

我很感激想法!

如果您從 C++ 端返回 QQuickItem,我認為這實際上非常簡單。 如果這樣做,您可以使用特定上下文創建它,您可以在其中將“特定硬件控制器”設置為屬性

QQmlComponent *qml_controller = new QQmlComponent(qengine, "some_file.qml");
QQmlContext *context = new QQmlContext(); //should probably give a pointer to owning object
context->setContextProperty("controller", pointer_to_hw_cont);

return qml_controller->create(context);

Loader 的setSource方法有額外的參數,您可以傳遞這些參數來為某些屬性提供初始值。 像這樣的東西:

ComboBox {
   model: controlerFactory.specificHWListModel
   onCurrentTextChanged: {
       var specificHWControler = controlerFactory.getObjectFor( currentText );
       loader1.setSource( 
           specificHWControler.qml_file,
           { "controler": specificHWControler }
       );
   }
}
Loader { 
    id: loader1
}

specificHWListModel的HWListModel 是QStringList 或一些自定義的QAbstractListModel。 getObjectFor可能只是一個可調用的 function。

Q_INVOKABLE QObject* getObjectFor(QString hwName);

如果您不設置QQmlEngine::setObjectOwnership ,則從Q_INVOKABLE function 返回的 object 默認將由QQmlEngine管理。 請記住將您的SpecificHWControler class 注冊到QQmlEngine

qml_file SpecificView.ui.qml應該具有屬性控制器,並且可以使用 Designer 進行編輯:

import SpecificHWControlerModule 1.0
Item {
    property SpecificHWControler controler

}

https://doc.qt.io/qtcreator/quick-connections-backend.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM