有机会使用QML的非QObject类

时间:2013-10-11 19:13:40

标签: c++ qml qobject

用于QML的Exposing Attributes of C++ Types to QML类必须是QObject s。我有可能使用非QObjects s(又名POCO,不是从QObject派生,而是在Qt元系统中注册)?

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

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

1 个答案:

答案 0 :(得分:2)

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

我相信你可以注册你自己的POD并将它们传递到它和QML一边(就像黑盒子一样 - 没有任何成员访问,从未尝试过)。要访问成员,可以使用一些get / set包装器代码,可以是QML单例上的方法形式,也可以是有效地用作每个实例包装器的QtObject后代。

目前不支持动态属性 - 您可以使用它们可能会使用一些非常奇怪的技巧,但它可能不值得(但如果您不想绑定对于属性,事情将变得更加简单,它仍然是QObjects。

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

我走这条路:

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

事实上,自定义POD并不享受内置程序所支持的相同级别的支持,标准语言实践是围绕操作垃圾收集的QObject实例(当然通过指针传递到处)构建的,观察了类型的变化属性:

  • POD
  • 列表
  • 的QObject
  • 变体(未观看成员变更,iirc)