我一直在阅读Qwidgets的所有权并删除它们。 例如:http://qt-project.org/doc/qt-4.8/objecttrees.html
这说明"你也可以自己删除子对象,他们会将自己从父母那里移除#34;
然而,我见过很多例子,在删除之前将父设置为null。 例如:
if (widget != NULL)
{
layout->removeWidget(widget);
widget->setParent(NULL);
delete widget;
}
是否需要setParent(NULL);
?
由此引出,我有什么理由不能做一个
delete layout->itemAt(i);
或
delete layout->takeAt(i);
事实上,最后两个之间有什么真正的区别吗? 我假设我的所有对象都在堆上。
答案 0 :(得分:6)
在删除它之前,根本不需要将小部件的父级设置为NULL
。子窗口小部件将在删除时自动从其父窗口注销。
对于您的第二个问题,itemAt
和takeAt
之间的真正区别在于itemAt
返回指定的布局项,takeAt
也会返回它,但另外还要从布局中删除它
使用takeAt
更改布局项目计数,因为它从布局中删除了返回的项目。所以要小心,不要在for ( int i = 0; i != layout->count(); ++i )
这样的循环中使用它,因为你最终会得到比当前layout->count()
更大的内容......
请注意,执行delete layout->itemAt(i);
不会自动从布局中删除已删除的项目,因此必须避免这种情况。