gpt4 book ai didi

qt - QObject 子对象的顺序(策略问题)

转载 作者:行者123 更新时间:2023-12-02 19:19:27 28 4
gpt4 key购买 nike

对于我的一个项目,我有一棵 QObject 派生对象树,它利用 QObject 的父/子功能来构建树。

这非常有用,因为我使用信号和槽,使用 Qt 的 protected 指针,并期望父对象在子对象被删除时也将其删除。

到目前为止一切顺利。不幸的是,现在我的项目要求我管理/更改子项的顺序。 QObject 不提供任何更改其子级顺序的方法(异常(exception):QWidget 的 raise() 函数 - 但在这种情况下毫无用处)。 所以现在我正在寻找一种控制 child 顺序的策略。我有一些想法,但我不确定它们的优缺点:



选项A:自定义排序索引成员变量

使用 int m_orderIndex 成员变量作为排序键,并提供 sortedChildren() 方法,该方法返回按此键排序的 QObject 列表。

  • 易于实现到现有的对象结构中。
  • QObject::children() 方法被重写时会出现问题 - 当项目的顺序更改时,会在循环期间导致问题,而且比默认实现更昂贵。
  • 如果所有排序键都相等或 0/默认,则应回退到 QObject 对象顺序。
<小时/>

选项 B:子项冗余列表

QList中维护子项的冗余列表,并在创建和销毁子项时向其中添加子项。

  • 需要昂贵的成本来跟踪添加/删除的对象。这基本上会导致第二个子/父跟踪和大量信号/槽。 QObject 已经在内部完成了所有这些工作,因此再次执行可能不是一个好主意。还感觉像改变 child 的顺序这样简单的事情就增加了很多臃肿。
  • 灵 active 良好,因为可以根据需要修改子级 QList。
  • 允许子项多次出现在 QList 中,或者根本不允许(即使它可能仍然是 QObject 的子项)
<小时/>

选项C:...?

任何想法或反馈,尤其是来自已经在自己的项目中解决了这个问题的人的想法或反馈,我们都将受到高度赞赏。新年快乐!

最佳答案

过去几天我花了很多时间研究所有这些选项,并与其他一些程序员仔细讨论。我们决定选择选项A

我们管理的每个对象都是父对象的子对象。由于 Qt 不提供任何对这些对象重新排序的方法,因此我们决定为每个对象添加一个 int m_orderIndex 属性,该属性默认为 0。

每个对象都有一个访问器函数sortedChildren(),它返回子对象的QObjectList。我们在该函数中所做的是:

  1. 使用普通的 QObject::chilren() 函数获取所有可用子对象的列表。
  2. dynamic_cast 所有对象到我们的“基类”,它提供 m_orderIndex 属性。
  3. 如果该对象是可转换的,请将其添加到临时对象列表中。
  4. qSort 与自定义 LessThan 函数结合使用来确定 qSort 是否需要更改两个对象的顺序。
  5. 返回临时对象列表。

我们这样做的原因如下:

  • 现有代码(尤其是 Qt 自己的代码)可以继续使用 children() 而不必担心副作用。
  • 我们可以在顺序无关紧要的地方使用普通的 children() 函数,而不会造成任何性能损失。
  • 在需要有序子列表的地方,我们只需将 children() 替换为 sortedChildren() 即可获得所需的效果。

这种方法的好处之一是,如果所有排序索引都设置为零,则子级的顺序不会改变。

很抱歉回答我自己的问题,希望能给有同样问题的人带来启发。 ;)

关于qt - QObject 子对象的顺序(策略问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991684/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com