Q_INVOKABLE方法返回自定义c++类型
Q_INVOKABLE method returning custom C++ type
我有一个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*");
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 自定义对象的dlib序列化在gcc中失败
- 自定义创建QFuture
- 如何在QT中的自定义视频小工具t上绘制矩形