[英]QML: C++ classes with “bring your own component”
我正在嘗試使用 QML 前端開發 Qt C++ 應用程序,但我遇到了障礙。
這是我到目前為止所擁有的:
setContextProperty
暴露於 QML 層。 現在,對於棘手的一點。 我希望“控制器”以“自帶組件”的方式運行。 這意味着他們將有一個方法為他們的 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.