Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?

Posted

技术标签:

【中文标题】Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?【英文标题】:Qt; QWidget removal and deletion. setParent(NULL) necessary? 【发布时间】:2014-11-08 12:32:11 【问题描述】:

我一直在阅读 Qwidget 的所有权并删除它们。 例如:http://qt-project.org/doc/qt-4.8/objecttrees.html

这表示“您也可以自己删除子对象,它们会将自己从父对象中删除”

但是,我看到很多示例在删除父项之前将其设置为 null。 例如:

if (widget != NULL)

    layout->removeWidget(widget); 
    widget->setParent(NULL);
    delete widget;

setParent(NULL); 有需要吗?

从这里开始,我有什么理由不能做一个

delete layout->itemAt(i);

delete layout->takeAt(i);

事实上,最后两者之间有什么真正的区别吗? 当然,我假设我所有的对象都在堆上。

【问题讨论】:

【参考方案1】:

在删除之前绝对不需要将小部件的父级设置为NULL。删除后,子小部件将自动从其父小部件中注销。

对于第二个问题,itemAttakeAt 之间的真正区别在于 itemAt 返回指定的布局项,takeAt 也返回它,但另外将其从布局中删除。

使用takeAt 会更改布局项计数,因为它会从布局中删除返回的项。所以要小心,不要在像 for ( int i = 0; i != layout->count(); ++i ) 这样的循环中使用它,因为你最终会得到 i 大于当前 layout->count()...

请注意,delete layout->itemAt(i); 不会自动从布局中删除已删除的项目,因此必须避免这种情况。

【讨论】:

非常好,这证实了我的想法。如果不能信任测试,我将避免删除布局->itemAt(i)。谢谢!

以上是关于Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章

移除和追加 DOM 元素

QT删除QWidget或QLayout下的控件

QVBoxLayout移除控件之后没有消失

23 Maven工程module的移除和重新导入

移除和替换印刷品[重复]

setParent 的 PyQt5 行为以显示没有布局的 QWidget