删除布局中的小部件

Iva*_*lov 6 c++ qt delete-operator

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

代码示例:

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();
Run Code Online (Sandbox Code Playgroud)

l1和会发生的事情会有所不同l2吗?

jdi*_*jdi 3

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

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

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    delete child->widget();
    delete child;
}
Run Code Online (Sandbox Code Playgroud)

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

  • “它们仍然被留在布局中作为错误的参考” - 不,它们不是。QLayout 监听 ChildRemoved 类型的事件并相应地删除项目。简单地删除小部件是安全的。 (3认同)