对 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

如何在我的代码中查明触发 QObject::connect 的调用的位置:无法在 Qt5 中对类型的参数进行排队?

QObject的多重继承

QObject::connect: 没有这样的信号

如何将 QObject 指针的属性公开给 QML