我正在为QML+C++应用程序构建一个插件系统。插件是QML文件。qml文件可能如下所示:
项目{标题:"性感插件"版本:"1.0"}
我如何在C++中阅读标题和版本?
每个QML项都直接或间接继承QObject
,因此您可以使用元系统"动态"读取和写入属性。
QVariant QObject::property(const char * name) const
返回对象的name属性的值。如果没有属性存在,返回的变体无效。
如果该项恰好是根项,则可以使用QQuickItem * QQuickView::rootObject() const
来获取它,如果不是,则必须设置适用于每个QObject
派生对象的objectName : QString
属性,并从根对象调用findChild<QObject*>("name")
。
最简单的方法是用C++编写QuickItem。即使它只是一个小组件,它也只包含标题和版本。然后,它可以很容易地在C++中访问,这是最干净的方式,将视图和逻辑解耦。然后,您可以使用众所周知的Q_PROPERTY宏定义属性。
如果您实际上只想使用Qml编写的组件,而不想在C++中编写任何内容,那么本页中提到了一个解决方案:http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
引用"从C++访问QML对象类型的成员"中的相关部分:
QQmlEngine engine;
QQmlComponent component(&engine, "MyItem.qml");
QObject *object = component.create();
qDebug() << "Property value:" << QQmlProperty::read(object, "someNumber").toInt();
QQmlProperty::write(object, "someNumber", 5000);
qDebug() << "Property value:" << object->property("someNumber").toInt();
object->setProperty("someNumber", 100);
所以QQmlProperty可能会帮助你。
我不知道你的目标是什么,我不会推荐任何东西。无论如何,在我看来,在许多情况下,用C++编写Item的第一种方法比从Qml中获取属性要干净得多。