我一直在阅读 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
。删除后,子窗口小部件将自动从其父窗口注销。
对于你的第二个问题,itemAt
和 takeAt
之间的真正区别在于 itemAt
返回指定的布局项,takeAt
也返回它,但另外将其从布局中删除。
使用 takeAt
更改布局项目计数,因为它从布局中删除了返回的项目。所以要小心,不要在像 for ( int i = 0; i != layout->count();++i )
这样的循环中使用它,因为你最终会得到 i大于当前 layout->count()
...
请注意,执行 delete layout->itemAt(i);
不会自动从布局中删除已删除的项目,因此必须避免这种情况。
关于c++ - Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26817169/