如何使用 QList 跟踪 child 类 的实例
How to use QList to keep track of instances of child classes
我有两个classes,Parent
和Child
(后者派生自前者),它们都是QObject派生的classes。这些 classes 被实现为树结构上的节点,赋予每个节点其特定的功能。在 Parent
class 下有一个信号,每当触发时都会创建一个 Child
类型的新 object。因此,在三个触发器之后,树结构将如下所示:
PARENT
----------Child1
----------Child (1)
----------Child (2)
我如何使用 QList
来跟踪创建的 child object 的数量?我想用名称附加索引号,这样 Child (1)
看起来像 Child 1
,现在看起来像一个副本。
我已经阅读了 QList
文档,并且我了解如何在 object 出现在列表中后提取有意义的信息,但我无法找到这部分的答案。
编辑:
假设我做了 QList<Child*>ListID
,这只是将 ListID
初始化为指向类型 Parent
的列表的指针,还是它也会填充该列表?
有什么建议吗?
PS:我想在开始实施之前知道这一点,因为我想知道我是否以错误的方式进行。这就是为什么我没有要显示的代码。我希望有更多的随意讨论。
一个光秃秃的QObject
本身就是一个树节点。 是的,QObject
是 QObject
s 的容器! 所以,您不需要做任何特别的事情,因为它保留了所有直接的列表children,并且还提供了一种递归获取特定类型或名称的所有 children 的方法。
要访问 children 的列表,请使用 QObject::children()
。要仅获取特定类型的 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
。
如果您确定只有 objects 的特定类型是 children,您可以改用 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 type Child
whenever triggered.
大概你指的是广告位?
我有两个classes,Parent
和Child
(后者派生自前者),它们都是QObject派生的classes。这些 classes 被实现为树结构上的节点,赋予每个节点其特定的功能。在 Parent
class 下有一个信号,每当触发时都会创建一个 Child
类型的新 object。因此,在三个触发器之后,树结构将如下所示:
PARENT
----------Child1
----------Child (1)
----------Child (2)
我如何使用 QList
来跟踪创建的 child object 的数量?我想用名称附加索引号,这样 Child (1)
看起来像 Child 1
,现在看起来像一个副本。
我已经阅读了 QList
文档,并且我了解如何在 object 出现在列表中后提取有意义的信息,但我无法找到这部分的答案。
编辑:
假设我做了 QList<Child*>ListID
,这只是将 ListID
初始化为指向类型 Parent
的列表的指针,还是它也会填充该列表?
有什么建议吗?
PS:我想在开始实施之前知道这一点,因为我想知道我是否以错误的方式进行。这就是为什么我没有要显示的代码。我希望有更多的随意讨论。
一个光秃秃的QObject
本身就是一个树节点。 是的,QObject
是 QObject
s 的容器! 所以,您不需要做任何特别的事情,因为它保留了所有直接的列表children,并且还提供了一种递归获取特定类型或名称的所有 children 的方法。
要访问 children 的列表,请使用 QObject::children()
。要仅获取特定类型的 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
。
如果您确定只有 objects 的特定类型是 children,您可以改用 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.
大概你指的是广告位?