为什么我的删除按钮没有删除QHBoxLayout上的所有小部件

时间:2018-07-23 06:55:27

标签: c++ qt

删除QHBoxLayout上的小部件时出现问题。 我使用QList列出我的布局,因为我在运行时添加了布局。 这是我的QList

QList<QHBoxLayout*> hBoxLayoutParent;

这是我添加小部件时的代码

hBoxLayoutParent.push_back(createNewHBoxParent());
hBoxLayoutParent.last()->addWidget(label);
hBoxLayoutParent.last()->addWidget(cmbBox);
hBoxLayoutParent.last()->addWidget(cmbJurusan);
hBoxLayoutParent.last()->addWidget(listButton.last());
ui->formLayout_2->addLayout(hBoxLayoutParent.last());

这就是我删除它们的方式

for(int i = 0; i < hBoxLayoutParent[index]->count(); i++)
{
    delete hBoxLayoutParent[index]->takeAt(0)->widget();
    qDebug() << "Widget Number: " << hBoxLayoutParent[index]->count();
}
hBoxLayoutParent.removeAt(index);

当我单击“删除”按钮时,并未全部删除。 cmbJurusan仍然存在。

1 个答案:

答案 0 :(得分:2)

问题在于您的for循环并没有完全按照您的想法计算。你有...

for (int i = 0; i < hBoxLayoutParent[index]->count(); i++)

因此,您每次迭代都会增加i。但是...

delete hBoxLayoutParent[index]->takeAt(0)->widget();

将从hBoxLayoutParent[index]中删除一个项目。因此,您正在修改要对其对象进行迭代的QHBoxLayout -每次迭代使i增加1,但布局中的项目数也减少1。

相反,请尝试...

while (!hBoxLayoutParent[index]->isEmpty()) {
  delete hBoxLayoutParent[index]->takeAt(0)->widget();
  qDebug() << "Widget Number: " << hBoxLayoutParent[index]->count();
}

还请注意,如果此代码在事件循环的上下文中运行,那么您可能想使用QObject::deleteLater而不是delete