2012-10-24 84 views
1

我使用QT,并有一个向量和一个QVBoxLayout填充Widgets。使用Add按钮填充这两个按钮并不是问题,但删除它们实际上并不奏效。从矢量和QVBoxLayout删除

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

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

回答

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

0

我改变它到现在看起来像矢量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; 
    } 
} 

编辑: 顺序改变了(第一removeWidget,然后删除)现在一切都很正常!