6

将 C++ 类型的属性暴露给与 QML一起使用的 QML 类必须是QObjects。任何机会我可以使用非QObjectss (又名 POCO,不是派生自QObject,而是在 Qt 元系统中注册)?

如果没有,是否有一个简单的通用包装系统来使我的对象符合 QML。我能想到的一种方法是将动态属性添加到简单的QObject.

或者有没有办法隐式转换为符合 QML 的类型,所以我根本不需要包装?

4

1 回答 1

2

这实际上是一个热门话题。

我相信您可以注册自己的 POD 并将它们传递给 ito 和 QML 端(就像黑盒子一样——没有任何成员访问权限,从未尝试过)。要访问成员,可以使用一些 get/set 包装器代码,或者以 QML 单例上的方法形式,或者在 QtObject 后代上有效地充当每个实例的包装器。

目前不支持动态属性——你可以用一些非常奇怪的技巧让它们工作,但这可能不值得(但如果你不想绑定到属性,事情会变得简单得多,而且它仍然是 QObjects)。

隐式转换意味着拥有某种预处理器(这可能是可行的,但会花费大量时间,并且需要将结果提交回 Qt(并终身支持它))。

我会这样:

  • 如果有问题的对象可以是 QObjects,测量性能(如果没问题,坚持下去)
  • 如果没有,请尝试按值传递不透明的 POD,如果可行,请创建包装脚手架,并查看它是否比前一个选项更快/提供更好的内存使用
  • 如果不需要绑定到属性,并且需要动态,请调查 a) 嵌套 QVariants b) 动态 QObject 属性
  • 如果应满足极高的速度/内存要求,请考虑编写一个自动生成包装器并将其连接到 Qt 项目构建管道的工具

问题是,自定义 POD 不享受与内置 do 相同级别的支持,并且标准语言实践是围绕操作垃圾收集的 QObject 实例(当然,通过指针到处传递)而构建的,这些实例已经关注-更改类型的属性:

  • 列表
  • 对象
  • 变体(不关注成员更改,iirc)
于 2013-10-14T19:18:09.453 回答