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

C++ 如何使用QList跟踪子类的实例,c++,qt,qlist,C++,Qt,Qlist,我有两个类,Parent和Child(后者派生自前者),它们都是QObject派生的类。这些类被实现为树结构上的节点,赋予每个节点特定的功能。在Parent类下有一个信号,每当触发时,该信号会创建一个类型为Child的新对象。因此,在三个触发器之后,树结构将如下所示: 母公司 ---------儿童1 ---------儿童(1) ---------儿童(2) 如何使用QList跟踪创建的子对象的数量?我想在索引号后面加上名字,这样子(1)看起来像子(1),现在看起来像一个副本 我已经阅读了QL

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

母公司

---------儿童1

---------儿童(1)

---------儿童(2)

如何使用
QList
跟踪创建的子对象的数量?我想在索引号后面加上名字,这样子(1)看起来像子(1),现在看起来像一个副本

我已经阅读了
QList
文档,了解了一旦对象出现在列表中,如何提取有意义的信息,但这部分我找不到答案

编辑:

假设我做了
QListListID
,这只是初始化
ListID
,作为指向类型为
Parent
的列表的指针,还是它也会填充该列表

有什么建议吗


PS:在我开始实施之前,我想知道这一点,因为我想知道我是否以错误的方式进行。这就是我没有代码显示的原因。我希望能有更多的随意讨论。

一个裸露的
QObject
本身就是一个树节点是,一个
QObject
QObject
s的容器
因此,您不需要做任何特殊的事情,因为它保留了其所有直接子级的列表,并且还提供了一种递归获取特定类型或名称的所有子级的方法

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

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

for (auto objChild : std::as_const(children()))
  if (auto child = qobject_cast<Child*>(objChild)) {
    ...
  }
父类
下有一个信号,每当触发时,该信号将创建一个类型为
子类
的新对象


大概你是指一个槽?

我不明白你的问题,特别是“我想在索引号后面加上名字,这样子(1)看起来像子(1),现在看起来像副本。”什么看起来像副本?为什么不能在
Parent
类中保留
QList
成员?因此在
Parent
中添加
QListSomeId
将创建一个父级可访问的子级列表?我听起来很愚蠢,但我以前从未使用过QList。而且
Child(1)
看起来像
Child
的副本,而不是
Child 1
。这个例子很武断。我需要列表以获得更详细的功能。我仍然不明白你所说的“看起来像副本”是什么意思,但是是的,
QListSomeId
是一种方法,你分配一个对象,向列表添加一个指针,你就有了一个可以跟踪的“子对象”。记住在适当的时候删除子项。如果
Child
类很简单,那么使用
QList
可能会更简单。@MichaelThomas很抱歉没有主题,但上周你问了很多新手问题。你需要阅读一些关于编程的知识。因为你不了解自己在做什么。特别是,阅读一些关于C++的特性。关于主题:使用智能指针,例如
QSharedPointer
std::shared\u ptr
作为容器的项目。@DmitrySazonov对此我深表歉意。我尽量使我的怀疑尽可能具体,我真的尽量不发垃圾邮件。这些问题都是新手,因为我才刚刚开始学习。我也不期待直接的解决方案;任何阅读材料的链接都完全符合这一要求。除非有人给我指出正确的方向,否则它太大了。我也尝试解决我的问题,而不是等待答案。我希望我没有把自己列入黑名单,不再问问题。我问了。我想说有一个
triggered()
信号连接到一个插槽,该插槽创建了一个
Child
类型的新实例。另外,为了澄清一下,我将能够将
list
视为一个普通数组类型的对象?我想获得总计数和索引。在回答之前:查看其类型-查看findChildren返回的类型,然后查看该类型支持哪些操作和属性。此外,由于for的范围,如果您只需要遍历它(迭代它的元素),那么您根本不需要关心
list
是否可以给您一个总计数或索引。
for (auto objChild : std::as_const(children())) {
  auto child = static_cast<Child*>(objChild);
  ...
}