Bas*_*Ben 6 qt children qt4 qobject
对于我的一个项目,我有一个QObject派生对象树,它利用QObject的父/子功能来构建树.
这非常有用,因为我使用了信号和插槽,使用Qt的保护指针并期望父对象在删除时删除子对象.
到现在为止还挺好.不幸的是,现在我的项目要求我管理/改变孩子的顺序.QObject没有提供任何改变其子节点顺序的方法(例外:QWidget的raise()函数 - 但在这种情况下这没用).所以现在我正在寻找一种控制孩子秩序的策略.我有一些想法,但我不确定他们的利弊:
使用int m_orderIndex
成员变量作为排序键,并提供一个sortedChildren()
方法,该方法返回按此键排序的QObject列表.
QObject::children()
方法被覆盖时会出现问题 - 当项目的顺序发生变化时,在循环期间会导致问题,也比默认实现更昂贵.在a中维护一个冗余的子项列表QList
,并在创建和销毁子项时添加子项.
任何想法或反馈,特别是那些已经在自己的项目中解决过这个问题的人,都会受到高度赞赏.新年快乐!
在过去的几天里,我花了很多时间浏览所有这些选项,并与其他一些程序员仔细讨论过.我们决定去选择A.
我们管理的每个对象都是父对象的子对象.由于Qt没有提供任何重新排序这些对象的方法,我们决定int m_orderIndex
为每个对象添加一个属性,默认为0.
每个对象都有一个访问函数sortedChildren()
,可以返回一个QObjectList
孩子.我们在该职能中所做的是:
QObject::chilren()
函数获取所有可用子对象的列表.dynamic_cast
我们的"基类"的所有对象,它提供了m_orderIndex
属性.qSort
自定义LessThan
函数来确定qSort是否需要更改两个对象的顺序.我们这样做是出于以下原因:
children()
而不必担心副作用.children()
在订单无关紧要的地方使用正常功能,而不会有任何性能损失.children()
的sortedChildren()
,并得到预期的效果.这种方法的一个好处是,如果所有排序索引都设置为零,则子项的顺序不会改变.
很抱歉回答我自己的问题,希望能够解决同样问题的人.;)