【问题标题】:Get a c++ object in QML and use it in javascript在 QML 中获取一个 c++ 对象并在 javascript 中使用它
【发布时间】:2011-07-21 17:11:54
【问题描述】:

我正在制作一个应用程序,我想在 C++ 源代码中从 QML 调用一个函数,并且该 C++ 函数返回我和对象,我可以在 QML 的 javascript 部分中使用具有相同属性的对象。我已经建立了联系和一切。我尝试发送 QVariantMap 并尝试在 javascript 中使用该对象,但我没有获得该对象的属性

【问题讨论】:

  • 所以在这个阶段您的 QML 可以识别 c++ 对象,对吗?您是否为要访问的元素创建了读写函数?
  • 我有这样的东西,这个 c++ 方法返回一个 qvariant 映射 QVariantMap Mediator::initialize() { vector<Node*> table; Mediator m; Node TestNode("1", table); QVariant test = QVariant::fromValue(TestNode); QVariantMap map; map.insert("1",proba); return map; } 和后来的 javascript 源代码:function foo(anObject) { console.log(anObject.getId()); } 所以我想从那个对象调用一个方法。到目前为止,如果我尝试访问地图,它只会打印“QVariant(Node)”抱歉没有格式化的文本
  • 您确定对象返回正确吗?我个人还没有看到任何带有返回对象实例的函数的示例(我可能是错的)。此外,我相信任何暴露给 qml 的对象都需要从 QDeclarativeItem 继承并使用 qml 注册...最后,如果一切正常并且您得到正确的实例,我希望通过 id 属性获取对象的 id:anObject.id (不是底层的 getter 函数)

标签: javascript c++ qml qt-quick


【解决方案1】:

有两种方法可以将基于 QObject 的类型从 C++ 导出到 QML:

  1. 直接从属性 READer 或 Q_INVOKABLE 函数返回独立的 QObject。注意,作为属性返回的对象拥有 C++ 所有权,Q_INVOKABLE-object 拥有 JS 所有权。您可以通过http://doc.qt.nokia.com/4.7/qdeclarativeengine.html#setObjectOwnership 更改此默认行为。
  2. 返回 QObject 数组。在这种情况下,您应该使用 QObjectList、QDeclarativePropertyMap(不是 QVariantMap)或 QAbstractListModel。

【讨论】:

    【解决方案2】:

    您要公开的类必须继承自 QObject(或 QDeclarativeItem,如果它们是 UI 组件),并且您必须在加载 QML 代码之前在您的 main() 或 Qt 插件中注册它们的类型。

    看看http://developer.qt.nokia.com/doc/qt-4.7/declarative-tutorials-extending-chapter1-basics.html

    【讨论】:

      【解决方案3】:

      要将对象作为函数返回值从 C++ 传递到 QML,返回值类型必须是 QVariant,而不是 QVariantMap,即使这是 C++ 代码中的类型。因此,只需将您的 initialize 函数签名更改为

      QVariant initialize();
      

      无需更改任何其他内容,然后您就可以访问属性。

      关于您以后想要在返回的对象上调用方法的评论,这是不可能的;返回的对象只是一组名称-值对。如果您希望对象具有 id 属性,则需要在 C++ 中将带有该键的值 insert 指向 C++ 中的 QVariantMap,然后再返回它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 2019-10-25
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多