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

Q_INVOKABLE method returning custom C++ type

本文关键字:自定义 c++ 类型 返回 方法 INVOKABLE      更新时间:2023-10-16

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

这是可能的,但您需要定义自定义类型作为一个接口。

首先在你的main()函数中:
qmlRegisterInterface<MyType>("MyType");

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

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

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

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

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

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

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

检查清单:验证您已完成以下工作:

  • 注册你的类型qmlRegisterType<MyType>("Mine", 1, 0, "MyType");(或使用qmlRegisterUncreatableType)
  • 在qml: import Mine 1.0
  • 中导入自定义类型从QObject中派生类。添加Q_OBJECT到你的类定义。

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

我认为Dimitri的答案只适用于当你的类型是可复制的(所以它不会为QObject工作)。我的理解是,当你有一个类型是由Qt操纵,例如,如果它是由一个可调用的返回,类型必须注册为一个元类型:

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