我有两个类(class),Parent
和 Child
(后者派生自前者),而这两个都是QObject的派生类。这些类被实现为树结构上的节点,赋予每个节点其特定的功能。下Parent
class 有一个信号创建一个类型为 Child
的新对象每当触发。因此,在三个触发器之后,树结构将如下所示:
家长
------------ child 1
------------ child (1)
------------ child (2)
我将如何使用 QList
跟踪创建的子对象的数量?我想用名称附加索引号,以便 Child (1)
看起来像 Child 1
, 它现在看起来像一个拷贝。
我已阅读 QList
文档,并且我了解如何在对象位于列表中后提取有意义的信息,但我无法找到这部分的答案。
编辑:
说我做了 QList<Child*>ListID
, 这会初始化 ListID
作为指向 Parent
类型列表的指针,还是它也会填充该列表?
有什么建议吗?
PS:我想在开始实现之前了解这一点,因为我想知道我是否以错误的方式进行。这就是为什么我没有要显示的代码。我希望进行更多的随意讨论。
最佳答案
裸QObject
本身就是一个树节点。 是的,一个QObject
是 QObject
的容器s! 因此,您不需要做任何特别的事情,因为它保留了所有直接子项的列表,并且还提供了一种递归获取特定类型或名称的所有子项的方法。
要访问子列表,请使用 QObject::children()
.要仅获取特定类型的 child ,请使用 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);
...
}
Under the
Parent
class there is a signal that creates a new object of typeChild
whenever triggered.
大概你的意思是插槽?
关于c++ - 如何使用 QList 跟踪子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046053/