从矢量和 QVBox布局中删除

Deleting from vector and QVBoxLayout

本文关键字:布局 删除 QVBox      更新时间:2023-10-16

我使用QT,并有一个向量和一个充满小部件的QVBoxLayout。用Add按钮填充两者没有问题,但删除它们并不真正有效。

如果我从最后一个到第一个删除小部件,一切正常,但是当我尝试以任何其他方式删除它们时,一切都失败了。也许有人有想法?

void listwindow::remove_entry()
{
vector<todo_list_entry *>::iterator pos;
int i=0;
for (pos=list_entrys_vector.begin();pos<=list_entrys_vector.end();pos++)
{
if((**pos).check_delete()==true)
{
listenLayout->removeWidget(*pos);
listenLayout->update();
list_entrys_vector.erase(pos);
delete list_entrys_vector[i];
break;
}
i++;
}
} 

在迭代向量的元素时,您可能遇到了迭代器失效的问题,因为在迭代向量的元素上使用erase。一旦你做了list_entrys_vector.erase(pos)pos就不再是一个有效的迭代器,所以当你下次尝试通过循环使用它时,坏事就会发生。不要在迭代时对矢量的每个单独元素使用擦除,而是等到最后并使用list_entrys_vector.clear()一次擦除它们。

或者,如果您不想删除所有条目,请使用remove_if的组合,然后erase。如果f是一个接受条目并返回true是否应该删除它的函数,则可以执行此操作。

pos = std::remove_if(list_entrys_vector.begin(),list_entrys_vector.end(),f);

现在,要删除的条目位于向量的末尾,pos 指向应删除的第一个条目。然后,您可以对这些条目执行其他操作,然后执行

list_entrys_vector.erase(pos,list_entrys_vector.end());

还有其他方法可以实现此目的,但要记住的关键是,在迭代矢量时,不能从矢量中删除元素。如果你想这样做,你必须使用类似的东西std::list.

我把它改成了这个,现在看来矢量 erease 工作得很好,但 listenLayout 给我带来了一些麻烦......如果我添加 4 个元素并删除第一个元素,我只能看到 3 和 4,删除 4 后突然出现 2 个......

void listwindow::remove_entry()
{
vector<todo_list_entry *> buffer_vector;
vector<todo_list_entry *>::iterator pos;

for ( pos = list_entrys_vector.begin(); pos != list_entrys_vector.end(); ) {
if((**pos).check_delete()==true) {
delete * pos;
pos = list_entrys_vector.erase(pos);
listenLayout->removeWidget(*pos);
listenLayout->update;
}
else {
++pos;
}
}

编辑: 更改了顺序(首先删除小部件,然后删除)现在一切正常!