QObject儿童的顺序(战略问题)

Bas*_*Ben 6 qt children qt4 qobject

对于我的一个项目,我有一个QObject派生对象树,它利用QObject的父/子功能来构建树.

这非常有用,因为我使用了信号和插槽,使用Qt的保护指针并期望父对象在删除时删除子对象.

到现在为止还挺好.不幸的是,现在我的项目要求我管理/改变孩子的顺序.QObject没有提供任何改变其子节点顺序的方法(例外:QWidget的raise()函数 - 但在这种情况下这没用).所以现在我正在寻找一种控制孩子秩序的策略.我有一些想法,但我不确定他们的利弊:



选项A:自定义排序索引成员变量

使用int m_orderIndex成员变量作为排序键,并提供一个sortedChildren()方法,该方法返回按此键排序的QObject列表.

  • 易于实现到现有的对象结构中.
  • QObject::children()方法被覆盖时会出现问题 - 当项目的顺序发生变化时,在循环期间会导致问题,也比默认实现更昂贵.
  • 如果所有排序键相等或0 /默认,则应回退到QObject对象顺序.

选项B:儿童冗余清单

在a中维护一个冗余的子项列表QList,并在创建和销毁子项时添加子项.

  • 需要昂贵的跟踪添加/删除的对象.这基本上导致第二个子/父跟踪和许多信号/时隙.QObject已在内部完成所有这些工作,因此再次执行它可能不是一个好主意.也感觉像为改变孩子的顺序这样的简单事情添加了很多臃肿.
  • 良好的灵活性,因为可以根据需要修改儿童的QList.
  • 允许子进程多次进入QList,或者根本不进入QList(即使它可能仍然是QObject的子进程)

选项C:...?

任何想法或反馈,特别是那些已经在自己的项目中解决过这个问题的人,都会受到高度赞赏.新年快乐!

Bas*_*Ben 7

在过去的几天里,我花了很多时间浏览所有这些选项,并与其他一些程序员仔细讨论过.我们决定去选择A.

我们管理的每个对象都是父对象的子对象.由于Qt没有提供任何重新排序这些对象的方法,我们决定int m_orderIndex为每个对象添加一个属性,默认为0.

每个对象都有一个访问函数sortedChildren(),可以返回一个QObjectList孩子.我们在该职能中所做的是:

  1. 使用普通QObject::chilren()函数获取所有可用子对象的列表.
  2. dynamic_cast我们的"基类"的所有对象,它提供了m_orderIndex属性.
  3. 如果对象是可转换的,请将其添加到临时对象列表中.
  4. 使用qSort自定义LessThan函数来确定qSort是否需要更改两个对象的顺序.
  5. 返回临时对象列表.

我们这样做是出于以下原因:

  • 现有代码(尤其是Qt自己的代码)可以继续使用,children()而不必担心副作用.
  • 我们可以children()在订单无关紧要的地方使用正常功能,而不会有任何性能损失.
  • 在这里我们需要孩子的有序列表的地方,我们只需更换children()sortedChildren(),并得到预期的效果.

这种方法的一个好处是,如果所有排序索引都设置为零,则子项的顺序不会改变.

很抱歉回答我自己的问题,希望能够解决同样问题的人.;)