2

我正在尝试使用 QML 前端开发 Qt C++ 应用程序,但遇到了障碍。

这是我到目前为止所拥有的:

  • 输出对象选择的工厂类。这些对象,我将称之为“控制器”,控制着不同的硬件。
    • 工厂将使用setContextProperty.
    • 控制器将基本上与控制工厂的组合框一起选择。

现在,对于棘手的一点。我希望“控制器”以“自带组件”的方式运行。这意味着他们将有一个方法为他们的控制器返回相应的 QML 文件。这应该不难做到,它基本上Loader是对工厂/经理的一种方法说,将带有组件的文件加载到占位符中。

但问题是:这个新创建的组件和这个新创建的控制器如何相互认识和交谈?这是我以前用 QWidgets 做的事情,只是在类之间有指针。很琐碎。

我之前为 QWidgets 尝试过这样的架构,但对于 QML 似乎并不理想。

我画了这张我最终希望发生的事情: 建筑理念

这种架构允许一个非常简单的插件系统(至少在 QWidgets 世界中),我非常想保留它。不是一个庞大的单身人士,并考虑到每一个可能的行动......

我很感激想法!

4

2 回答 2

1

LoadersetSource方法有额外的参数,你可以传递它来为某些属性提供初始值。像这样的东西:

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

冷的specificHWListModel是 QStringList 或一些自定义的 QAbstractListModel。并且getObjectFor可能只是一个可调用的函数。

Q_INVOKABLE QObject* getObjectFor(QString hwName);

函数返回的对象,如果你不设置的话,默认Q_INVOKABLE会被管理。请记住将您的课程注册到.QQmlEngineQQmlEngine::setObjectOwnershipSpecificHWControlerQQmlEngine

qml_fileSpecificView.ui.qml应该具有属性控制器,并且可以使用 Designer 进行编辑:

import SpecificHWControlerModule 1.0
Item {
    property SpecificHWControler controler

}

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

于 2021-03-13T22:35:42.640 回答
1

如果您从 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);
于 2021-03-13T22:18:22.023 回答