从vector和QVBoxLayout中删除

时间:2012-10-24 18:51:41

标签: c++ qt vector

我使用QT并有一个向量和一个QVBoxLayout填充Widgets。用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++;
 }
} 

2 个答案:

答案 0 :(得分:0)

在迭代过程中对向量的元素使用erase时,您可能遇到迭代器失效问题。执行list_entrys_vector.erase(pos)后,pos不再是有效的迭代器,因此当您下次循环时尝试使用它时,会发生不好的事情。在迭代过程中,不要在向量的每个单独元素上使用擦除,而是等到最后并使用list_entrys_vector.clear()一次擦除所有元素。

或者,如果您不想删除所有条目,请使用remove_iferase的组合进行删除。如果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

之类的东西

答案 1 :(得分:0)

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

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

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