关于在 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
所以出现了一些问题:
- 每个 小部件都需要 needed/required 一个 parent 吗?如果没有,例外情况是什么?如果是,widgets without parent?
会怎样
我问这个是因为从 Qt 文档中的示例中,一些示例小部件有 parents(QLabel
example) but some doesn't (QBarChart
example,还有 QFont
、QColor
等... ).
所以我想知道是否有例外,或那些小部件不需要任何parents,或 如果出于某种原因我用 new
声明它们,之后我必须 delete
。
反之亦然...
- 没有 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
创建的小部件没有父级并且不附加任何东西 - 它正在泄漏内存。您必须使用 delete
或 QObject::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
后相同。
从
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
所以出现了一些问题:
- 每个 小部件都需要 needed/required 一个 parent 吗?如果没有,例外情况是什么?如果是,widgets without parent? 会怎样
我问这个是因为从 Qt 文档中的示例中,一些示例小部件有 parents(QLabel
example) but some doesn't (QBarChart
example,还有 QFont
、QColor
等... ).
所以我想知道是否有例外,或那些小部件不需要任何parents,或 如果出于某种原因我用 new
声明它们,之后我必须 delete
。
反之亦然...
- 没有 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
创建的小部件没有父级并且不附加任何东西 - 它正在泄漏内存。您必须使用 delete
或 QObject::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
后相同。