Qt;Q删除和删除小部件.setParent(NULL)是必需的

Qt; QWidget removal and deletion. setParent(NULL) necessary?

本文关键字:删除 NULL setParent 小部 Qt      更新时间:2023-10-16

我一直在阅读Qwidgets的所有权并删除它们。例如: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);

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

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

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

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

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