【发布时间】:2014-11-08 13:17:28
【问题描述】:
我正在为我的 QML+C++ 应用程序构建一个插件系统。插件是 QML 文件。 一个 qml 文件可能如下所示:
项目{ 标题:“性感插件” 版本:“1.0” }
如何在 C++ 中读取标题和版本?
【问题讨论】:
我正在为我的 QML+C++ 应用程序构建一个插件系统。插件是 QML 文件。 一个 qml 文件可能如下所示:
项目{ 标题:“性感插件” 版本:“1.0” }
如何在 C++ 中读取标题和版本?
【问题讨论】:
每个 QML 项目都直接或间接地继承 QObject,因此您可以使用元系统“动态地”读取和写入属性。
QVariant QObject::property(const char * name) const
返回对象名称属性的值。如果没有这样 属性存在,返回的变体无效。
如果该项目恰好是根项目,您可以使用QQuickItem * QQuickView::rootObject() const 来获取它,如果不是,则必须设置objectName : QString 属性,该属性适用于每个QObject 派生对象并调用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 获取属性要干净得多。
【讨论】: