C++ 删除布局中的小部件
如果我们为布局中的C++ 删除布局中的小部件,c++,qt,delete-operator,C++,Qt,Delete Operator,如果我们为布局中的小部件运行删除小部件,会发生什么?如果这个案例是用文档编写的,请给我链接(我没有找到) 代码示例: QLabel *l1 = new QLabel("1st"); QLabel *l2 = new QLabel("2nd"); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(l1); layout->addWidget(l2); QWidget *mainWidget = new QWidget;
小部件
运行删除小部件
,会发生什么?如果这个案例是用文档编写的,请给我链接(我没有找到)
代码示例:
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
,会发生不同的事情吗?我相信您正在做的事情几乎是一样的,尽管这两种方式都不会正确地从布局中删除您应该做的事情。它们仍然在布局中作为错误引用保留(如果我没记错的话)
第一个只是现在删除该项。一旦控件返回到事件循环,第二个将删除它。但实际上,人们通常从版面中删除项目的方式是将其从版面中删除(给版面一个自我调整的机会),然后删除项目及其小部件(如果需要)
同样,只有当您想要销毁所添加的小部件时,才需要删除小部件(
child->widget()
)。(Qt将删除它自己的小部件,如果你设置了)调用删除和删除的区别是,<代码>删除>代码>是调用调用析构函数并释放与对象相关联的内存的普通C++。p>
deleteLater()
方法,如中所述,在进入事件循环时删除对象
QLayout的侦听类型为ChildRemoved的事件并删除项目
因此。简单地删除小部件是安全的
通过。不要在连接有活动插槽的QoObject上使用delete l1,否则会发生崩溃。 使用: l1->隐藏(); l1->deleteLater();
这对我来说很好“它们在布局中仍然是不好的引用”-不,它们不是。QLayout的侦听类型为ChildRemoved的事件,并相应地删除项目。简单地删除小部件是安全的。是的,我不确定。但take过程是一个被广泛接受的过程pattern@FrankOsterfeld请写下你的答案,我会接受的。@FrankOsterfeld你能帮我写一封推荐信吗?这可能不适用于5.3.2。“一般来说,当你删除它的小部件时,Qt不喜欢它。”这不是真的,你可以安全地删除小部件。很好地发现@FrankOsterfeld。我编辑了我的答案以使其更为正确。细节是:在处理要删除的小部件的事件或插槽调用时,永远不要删除此。将事件传递给您的代码或调用插槽的信号可能没有为此做好准备
this->deleteLater()
在任何情况下都是安全的。
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
delete child->widget();
delete child;
}