【问题标题】:Sorting QObject children对 QObject 子项进行排序
【发布时间】:2010-12-02 22:35:45
【问题描述】:

我注意到 QObject::children() 方法返回对 QObjectList 的 const 引用,其中包含 qobject 的子项。抛弃常量并使用 qSort 对列表进行排序是否安全?

谢谢 安东

【问题讨论】:

    标签: qt sorting children qobject


    【解决方案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之外不共享任何基类),所以会有大量的重复代码.
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多