我有一个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 ++方法的返回类型。
答案 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版本中的一个错误。
清单:确认您已执行以下操作:
qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
(或使用qmlRegisterUncreatableType)import Mine 1.0
Q_OBJECT
添加到了您的类定义中。从Q_INVOKABLE
方法返回指针时,请考虑object ownership。
答案 3 :(得分:0)
我认为Dimitri的答案仅适用于您的类型是可复制的(因此不适用于QObject)。我的理解是,当您使用Qt操纵的类型时,例如,如果它是由可调用的返回,则该类型必须注册为metatype:
Foo*
,您可以将其注册为元类型系统:qRegisterMetaType<Foo*>("Foo*");