我正在开发一个在QGraphicsScene
. 这些项目具有属性,如果选择了该项目,我想在树视图中显示这些属性。如果可能的话,我想坚持使用QObject
. 但是,这并不适合我的所有需求,因为我需要沿属性存储一些元数据,例如
- 用于分组的类别(例如“系统属性”和“用户属性”)
- 当鼠标悬停在树视图中的属性上时显示的工具提示文本。
受Qt 属性浏览器和 Qt 的对象框架的启发,我想实现以下系统:
- 场景中的所有项目都派生自
PropertyItem
(它本身继承QGraphicsItem
或QGraphicsObject
)。它包含获取和设置属性值的逻辑。 - 每个派生的类
PropertyItem
都有一个 staticMetaPropertyItem
。 - A
MetaPropertyItem
持有类MetaProperty
的实例,以便存储有关属性的元数据,例如类别、工具提示字符串和属性的类型。 - 每当在场景中选择一个项目时,
Property
都会为每个MetaProperty
关联的MetaPropertyItem
. 然后,这些属性会显示在树视图中,并在取消选择该项目时将其删除。
我越想这个设计,就越觉得我做错了什么。看来我只是在复制已经是 Qt 一部分的内容:
PropertyItem <--> QObject
MetaPropertyItem <--> QMetaObject
MetaProperty <--> QMetaProperty
Property <--> needs to be implemented
我还发现了这个bug ticket,它建议将元数据添加到 Qt 属性。不幸的是,到目前为止,它没有引起任何关注。
在寻找替代方案时,我还偶然发现了QMetaPropertyBuilder
哪个(可能?)将成为 Qt 5 的一部分。不幸的是,关于这个类的文档很少,而且我从阅读源代码中了解到的内容并不能解决我的问题。
因此,我的问题是:实际上是否有更好的方法可以在不重新实现另一个 Qt 框架的情况下实现我正在寻找的东西?