有机会使用QML的非QObject类

Hor*_*ter 6 c++ qobject qml

至于将C++类型的属性暴露给与QML一起使用的QML类必须是QObjects.我有可能使用非QObjectss(又名POCO,不是从QObjectQt元系统中派生出来的,而是注册的)

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

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

mlv*_*ljr 2

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

我相信您可以注册自己的 POD 并将它们传递到 ito 和 QML 端(就像黑匣子一样 - 没有任何成员访问权限,从未尝试过)。为了访问成员,可以使用一些获取/设置包装器代码,无论是在 QML 单例上的方法形式,还是在有效充当每个实例包装器的 QtObject 后代上。

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

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

我会这样走:

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

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

  • 列表
  • 对象对象
  • 变体(未观察成员变化,iirc)