排序QObject的子元素

3
我注意到 QObject::children() 方法返回一个包含 qobject 子对象的 QObjectList 的 const 引用。是否可以去掉 const 限制并使用 qSort 对列表进行排序?
谢谢 Anton
2个回答

3
不,你不应该这样做。这是QObject::children()的定义:
inline const QObjectList &children() const { return d_ptr->children; }

这意味着您直接获得内部对象列表的引用。 文档中提到: 请注意,当QWidget子项被提升或降低时,列表顺序会发生变化。被提升的小部件成为列表中的最后一个对象,而被降低的小部件则成为列表中的第一个对象。 看起来更改此列表是个坏主意。

我检查了QObject :: lower()等代码。看起来他们实际上是手动重新排序这个列表,就像我会做的那样。唯一的区别是QWidget是QObject的友元,因此QWidget可以访问d pimpl指针,从而使其可以访问QObjectList而不需要constness。我将尝试这种方法...如果发生任何不良情况,我会在这里发布。 - ak.

1
也许吧。但为什么要冒险呢?你不能只是复制 QObjectList 并对本地副本进行排序吗?

好的,有一些原因,我有几个派生自QObject的类,它们形成了一棵树,我希望叶子节点以某种方式排序。存储副本是一种方法,但会出现一些问题:1)当添加/删除子项时,必须使本地副本保持最新状态。2)您无法调用QObject::children()来获取子项,应该在派生类上引入一个特殊函数(除了QObject之外,这些类不共享任何基类),因此将有大量重复代码。 - ak.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接