【问题标题】:Q_INVOKABLE method returning custom C++ typeQ_INVOKABLE 方法返回自定义 C++ 类型
【发布时间】:2014-06-25 17:20:05
【问题描述】:

我有一个 C++ 方法制作了 Q_INVOKABLE。我可以从 QML 调用这个方法,当它返回基本类型(如 QString)时它可以工作。但我不能使用自定义类型。我该怎么做?我应该返回 QVariant 吗?理想情况下,如果可能,我想返回一个指向我的自定义类型的指针。

编辑 我愿意:

qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
qmlEngine->rootContext()->setContextProperty("testObj", new MyType());

我可以使用 testObj 全局对象或创建 MyType QML 组件。但我不能在某些 javascript 代码中使用它作为 Q_INVOKABLE C++ 方法的返回类型。

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    这是可能的,但您需要定义您的自定义类型 作为interface。

    首先在你的 ma​​in() 函数中:

    qmlRegisterInterface<MyType>("MyType");
    

    现在你可以继续创建一个对象并返回一个指针 在Q_INVOKABLE:

    MyType* example = new MyType(parent);
    return example;
    

    注意:将父对象传递给您的自定义 QObject 以确保该对象与其父对象一起被删除(以避免内存泄漏)可能会有所帮助。

    【讨论】:

    • 如果提供了nullptr parent,则在qml代码中超出范围时该对象被删除,因此也没有内存泄漏。如果提供了实际的父对象,则该对象连同其父对象一起被删除。但是,这仅基于我的实验;我在文档中没有找到对这种行为的任何保证。
    【解决方案2】:

    请注意,此答案的目标是有类似问题的人,而不是最初的提问者。

    所描述的方法应该可以工作,至少在 Qt 的最新版本中(我使用的是 Qt 5.12,但它也应该在旧版本中工作)。也许这是第一个 QML 版本中的一个错误。

    清单:确认您已完成以下操作:

    从Q_INVOKABLE 方法返回指针时,请考虑object ownership。

    【讨论】:

      【解决方案3】:

      我认为 Dimitri 的答案仅适用于您的类型是可复制的(因此它不适用于 QObject)。我的理解是,当您有一个由 Qt 操作的类型时,例如,如果它由一个可调用对象返回,则该类型必须注册为 metatype:

      • 像任何 QObject 派生模型这样的不可复制类型不能是元类型
      • 指针类型是不同的类型,因此它需要与其指向的类分开注册
      • 对于指针类型Foo*,您可以将其注册到元类型系统:qRegisterMetaType&lt;Foo*&gt;("Foo*");

      【讨论】:

        【解决方案4】:

        是的,QVariant 是您在该构造中自定义类的方法。请务必注册您的课程。

        话虽如此,您可能希望考虑使用 Q_PROPERTY 代替您的自定义类型,然后即使没有函数调用也可以访问它。如果您需要方法的自定义参数并且您无法重新排列代码,这显然不是一个选项。

        【讨论】:

        • 非常感谢。然后我会尝试使用 QVariant。另外,感谢有关使用 Q_PROPERTY 的建议。在我的例子中,方法调用是检索一个对象,这样一个属性就很有意义了。谢谢!
        • 根据文档,应该可以将自定义 C++ 类型从 Q_INVOKABLE 方法返回到 QML。有可能还是文档中的错误?
        • @Korchkidu:我认为,如果您正确注册类型是可能的。
        • 好吧,我可以注册类型,用 setContextProperty() 创建这个自定义 C++ 类型的全局对象,在 QML 中使用它。但是我不能从 Q_INVOKABLE 方法返回这种类型...
        猜你喜欢
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多