[英]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 版本中的一个错误。
清单:确认您已完成以下操作:
qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
(或使用qmlRegisterUncreatableType )import Mine 1.0
Q_OBJECT
添加到您的类定义中。 当从Q_INVOKABLE
方法返回指针时,请考虑对象所有权。
我认为 Dimitri 的答案仅适用于您的类型是可复制的(因此它不适用于 QObject)。 我的理解是,当您有一个由 Qt 操作的类型时,例如,如果它由可调用对象返回,则该类型必须注册为元类型:
Foo*
您可以使用元类型系统注册它: qRegisterMetaType<Foo*>("Foo*");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.