【问题标题】:Load property from QML-file in C++从 C++ 中的 QML 文件加载属性
【发布时间】:2014-11-08 13:17:28
【问题描述】:

我正在为我的 QML+C++ 应用程序构建一个插件系统。插件是 QML 文件。 一个 qml 文件可能如下所示:

项目{ 标题:“性感插件” 版本:“1.0” }

如何在 C++ 中读取标题和版本?

【问题讨论】:

    标签: c++ qt qml qt5.3


    【解决方案1】:

    每个 QML 项目都直接或间接地继承 QObject,因此您可以使用元系统“动态地”读取和写入属性。

    QVariant QObject::property(const char * name) const  
    

    返回对象名称属性的值。如果没有这样 属性存在,返回的变体无效。

    如果该项目恰好是根项目,您可以使用QQuickItem * QQuickView::rootObject() const 来获取它,如果不是,则必须设置objectName : QString 属性,该属性适用于每个QObject 派生对象并调用findChild<QObject*>("name")从根对象。

    【讨论】:

      【解决方案2】:

      最简单的方法是用 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 获取属性要干净得多。

      【讨论】:

      • 使用“component.create()”时,是否会创建一个新实例?我有两个 C++ 文件怎么样,两个文件都想访问已经创建的 QObject。如何实施?谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2012-01-25
      • 2015-12-15
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多