对于我的一个项目,我有一个 QObject 派生对象树,它利用 QObject 的父/子功能来构建树。
这非常有用,因为我使用信号和槽,使用 Qt 的受保护指针并期望父对象在删除子对象时删除它们。
到现在为止还挺好。不幸的是,现在我的项目需要我管理/更改孩子的顺序。QObject 没有提供任何改变其子级顺序的方法(例外:QWidget 的 raise() 函数——但在这种情况下这没有用)。所以现在我正在寻找一种控制孩子顺序的策略。我有一些想法,但我不确定它们的优缺点:
选项 A:自定义排序索引成员变量
使用int m_orderIndex
成员变量作为排序键并提供一个sortedChildren()
方法,该方法返回按此键排序的 QObject 列表。
- 易于实施到现有的对象结构中。
- 当
QObject::children()
方法被覆盖时会出现问题 - 当项目的顺序改变时会导致循环期间出现问题,也比默认实现更昂贵。 - 如果所有排序键都相等或 0/默认值,则应回退到 QObject 对象顺序。
选项 B:子项冗余列表
在 a 中维护一个冗余子级列表QList
,并在创建和销毁时将子级添加到其中。
- 需要昂贵的跟踪添加/删除的对象。这基本上会导致第二个孩子/父母跟踪和大量信号/插槽。QObject 已经在内部完成了所有这些操作,因此再次执行此操作可能不是一个好主意。也感觉像改变孩子的顺序这样简单的事情增加了很多臃肿。
- 良好的灵活性,因为可以根据需要修改子项的 QList。
- 允许一个孩子多次出现在 QList 中,或者根本不出现(即使它可能仍然是 QObject 的一个孩子)
选项 C:...?
任何想法或反馈,尤其是来自已经在自己的项目中解决此问题的人,都将受到高度赞赏。新年快乐!