6

如果我们在布局中delete widget运行会发生什么?widget如果这个案例写在文档中,请给我链接(我没找到)。

代码示例:

QLabel *l1 = new QLabel("1st");
QLabel *l2 = new QLabel("2nd");
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(l1);
layout->addWidget(l2);

QWidget *mainWidget = new QWidget;
mainWidget->setLayout(layout);
mainWidget->show();

delete l1;
l2->deleteLater();

l1对于和会发生什么不同的事情l2吗?

4

4 回答 4

3

我相信您所做的几乎相同,尽管两者都不会按照您应该做的方式正确地从布局中删除。它们仍然在布局中作为不良参考(如果我没记错的话)

第一个现在只是删除该项目。一旦控件返回事件循环,第二个将删除它。但实际上,人们通常从布局中删除项目的方式是将它们从布局中取出(给它一个自我调整的机会),然后删除项目及其小部件(如果你愿意的话)。

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    delete child->widget();
    delete child;
}

同样,child->widget()仅当您想要销毁已添加的小部件时,才需要删除小部件 ( ),以及持有它的布局项。

于 2012-08-18T18:22:20.317 回答
3

QLayout 监听 ChildRemoved 类型的事件并相应地删除项目。简单地删除小部件是安全的。

@FrankOsterfeld 这里

于 2012-09-07T14:47:53.473 回答
1

不要在连接有活动插槽的 Qobjects 上使用 delete l1,你会遇到崩溃。使用:l1->hide(); l1->deleteLater(); 这对我来说可以

于 2012-09-08T15:11:50.540 回答
0

通常,我不喜欢删除 Qt 小部件,而是将它们从适当的布局中删除。(如果您设置Delete on close window 属性, Qt 将删除它自己的小部件。 )调用 delete 和稍后删除之间的区别在于delete,普通的 C++删除操作将调用析构函数并释放与对象关联的内存。

如Qt 文档deleteLater()中所讨论的,该方法在进入事件循环时删除对象。

于 2012-08-18T18:45:35.627 回答