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

时间:2014-06-25 17:20:06

标签: c++ qt qml

我有一个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 ++方法的返回类型。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

首先在 main()函数中:

qmlRegisterInterface<MyType>("MyType");

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

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

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

答案 2 :(得分:0)

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

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

清单:确认您已执行以下操作:

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

答案 3 :(得分:0)

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

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