对 QObject 子项进行排序
Posted
技术标签:
【中文标题】对 QObject 子项进行排序【英文标题】:Sorting QObject children 【发布时间】:2010-12-02 22:35:45 【问题描述】:我注意到 QObject::children() 方法返回对 QObjectList 的 const 引用,其中包含 qobject 的子项。抛弃常量并使用 qSort 对列表进行排序是否安全?
谢谢 安东
【问题讨论】:
【参考方案1】:不,你不应该这样做。这是QObject::children()的定义:
inline const QObjectList &children() const return d_ptr->children;
这意味着您可以直接获取内部对象列表的引用。 文档说:
请注意,列表顺序会在 QWidget 孩子被抚养或 降低。一个被提升的小部件 成为列表中的最后一个对象, 并且降低的小部件变为 列表中的第一个对象。
弄乱这个列表似乎是个坏主意。
【讨论】:
我检查了 QObject::lower() 等的代码。看起来他们实际上是手动重新排序这个列表,就像我会做的那样。唯一的区别是 QWidget 是 QObject 的朋友,所以 QWidget 可以访问 d pimpl 指针,这使它可以访问 QObjectList 而无需 const 。我实际上会尝试这种方法......如果发生任何不好的事情,我会在这里发布。【参考方案2】:也许吧。但为什么要冒险呢?你不能只复制QObjectList
并对本地副本进行排序吗?
【讨论】:
嗯,有一些原因,我有几个QObject
派生类,它们形成一棵树,我希望叶子以某种方式排序。存储副本是一种方法,但会出现一些问题:1)当添加/删除子项时,您必须保持本地副本为最新。 2)不能调用QObject::children()来获取children,派生类需要引入一个特殊的函数(这些类除了QObject之外不共享任何基类),所以会有大量的重复代码.以上是关于对 QObject 子项进行排序的主要内容,如果未能解决你的问题,请参考以下文章
QObject::connect: 不能对类型为“QModbusDevice::State”的参数进行排队
等价于 QObject::findChild 函数的 qml-child-items