如何使用QList跟踪子类的实例

时间:2017-05-18 11:06:59

标签: c++ qt qlist

我有两个类,ParentChild(后者派生自前者),这些都是QObject派生类。这些类实现为树结构上的节点,为每个节点提供其特定功能。在Parent类下,有一个信号会在触发时创建类型为Child的新对象。因此,在三次触发后,树结构将如下所示:

PARENT

---------孩子1

---------孩子(1)

---------孩子(2)

我如何使用QList来跟踪创建的子对象的数量?我想用名称附加索引号,以便Child (1)看起来像Child 1,现在看起来像是一个副本。

我已经阅读了QList文档,并了解了如何在对象列表中提取有意义的信息,但这部分我无法找到答案。< / p>

编辑:

说我做了QList<Child*>ListID,这只是初始化ListID作为指向类型Parent列表的指针,还是会填充该列表?

有什么建议吗?

PS:我想在开始实施之前知道这一点,因为我想知道我是否会以错误的方式解决这个问题。这就是为什么我没有代码可以显示。我希望能有更多的随意讨论。

1 个答案:

答案 0 :(得分:2)

QObject本身就是一个树节点。 是的,QObjectQObject s的容器!所以,你根本不需要做任何特别的工作,因为它会保留所有直接子项的列表,并且还提供了一种递归获取特定类型或名称的所有子项的方法。

要访问儿童列表,请使用QObject::children()。要仅获取特定类型的子级,请使用QObject::findChildren()

在您的情况下,您可以在需要时调用auto list = findChildren<Child*>({}, Qt::FindDirectChildrenOnly)来获取列表。如果您不想动态分配任何内存,请直接使用QObject的内部列表:

for (auto objChild : std::as_const(children()))
  if (auto child = qobject_cast<Child*>(objChild)) {
    ...
  }

Pre C ++ - 17,使用qAsConst代替std::as_const

如果您确定只有特定类型的对象是子对象,则可以使用static_cast代替并节省一点运行时间:

for (auto objChild : std::as_const(children())) {
  auto child = static_cast<Child*>(objChild);
  ...
}
  

Parent类下,有信号,只要触发,就会创建Child类型的新对象。

大概你的意思是一个插槽?