繁体   English   中英

Q_INVOKABLE 方法返回自定义 C++ 类型

[英]Q_INVOKABLE method returning custom C++ type

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

编辑我做:

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

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

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

首先在你的main()函数中:

qmlRegisterInterface<MyType>("MyType");

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

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

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

是的, QVariant是您在该构造中自定义类的方法。 确保您注册了您的课程。

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

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

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

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

当从Q_INVOKABLE方法返回指针时,请考虑对象所有权

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

  • 不可复制的类型(如任何 QObject 派生模型)不能是元类型
  • 指针类型是不同的类型,因此它需要与其指向的类分开注册
  • 对于指针类型Foo*您可以使用元类型系统注册它: qRegisterMetaType<Foo*>("Foo*");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM