Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除布局中的小部件_C++_Qt_Delete Operator - Fatal编程技术网

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;
}