关于在 Qt 中设置 parent 小部件的问题

Issue regarding setting parent of widget in Qt

这里,总的来说:

All QObjects will delete their own child objects automatically. (See docs here.) QWidgets are QObjects. So as long as you establish a parent/child relationship, you do not need to manually delete your objects. To do that, simply pass a pointer to the parent object to the constructor:

QLabel *label1 = new QLabel;   // <<- NEED TO DELETE
QLabel *label2 = new QLabel(some_parent_obj);   // Will be deleted when some_parent_obj is deleted

所以出现了一些问题:

  1. 每个 小部件都需要 needed/required 一个 parent 吗?如果没有,例外情况是什么?如果是,widgets without parent?
  2. 会怎样

我问这个是因为从 Qt 文档中的示例中,一些示例小部件有 parents(QLabel example) but some doesn't (QBarChart example,还有 QFontQColor 等... ).

所以我想知道是否有例外,那些小部件不需要任何parents, 如果出于某种原因我用 new 声明它们,之后我必须 delete

反之亦然...

  1. 没有 parent 保证 的小部件是否会导致内存泄漏(或类似的事情),当它所在的小部件(不需要它的 parent) 被删除?或者如果它从布局中删除而没有发生任何删除?

因为根据我的代码经验,我可能已经创建了很多(~100)个小部件和其他东西,但既没有设置任何 parent(之后也没有使用 delete),并且该项目似乎 运行 很好,即使在一段时间后也没有任何停顿(尽管效果可能是潜在的,因为我没有 运行 Memcheck),因此这个问题在这里。

Does every widget necessary needed/required a parent?

如果您希望它们被自动删除 - 是的。但是...

If no, what are the exceptions? If yes, what happens to widgets without parent?

如果您使用 QLayout::addWidget. If you look into source code 将小部件附加到布局,则无需为小部件提供父级,您会看到这样做时,它会自动将布局的父级附加为小部件的父级(除非您没有'将布局附加到任何小部件)。

但是,如果您让使用 new 创建的小部件没有父级并且不附加任何东西 - 它正在泄漏内存。您必须使用 deleteQObject::deleteLater 删除它。当对象有任何连接时,建议使用最后一个选项。

Does a widget without parent guarantee to cause a memory leak (or something similar) when the widget which it stays in (not necessary its parent) is deleted? Or if it's removed from a layout without any deletion happening?

正如我已经提到的,QLayout::addWidget 为添加的小部件设置父级,所以答案是否定的。另请注意,当您调用 QLayout::removeWidget 时,它仅从布局中删除 QLayoutItem,但小部件的父级保持与调用 QLayout::addWidget 后相同。