我有两个类,Parent
和Child
(后者派生自前者),这些都是QObject派生类。这些类实现为树结构上的节点,为每个节点提供其特定功能。在Parent
类下,有一个信号会在触发时创建类型为Child
的新对象。因此,在三次触发后,树结构将如下所示:
PARENT
---------孩子1
---------孩子(1)
---------孩子(2)
我如何使用QList
来跟踪创建的子对象的数量?我想用名称附加索引号,以便Child (1)
看起来像Child 1
,现在看起来像是一个副本。
我已经阅读了QList
文档,并了解了如何在对象列表中提取有意义的信息,但这部分我无法找到答案。< / p>
编辑:
说我做了QList<Child*>ListID
,这只是初始化ListID
作为指向类型Parent
列表的指针,还是会填充该列表?
有什么建议吗?
PS:我想在开始实施之前知道这一点,因为我想知道我是否会以错误的方式解决这个问题。这就是为什么我没有代码可以显示。我希望能有更多的随意讨论。
答案 0 :(得分:2)
裸QObject
本身就是一个树节点。 是的,QObject
是QObject
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
类型的新对象。
大概你的意思是一个插槽?