C++ 从矢量和QVBoxLayout中删除
我使用QT,有一个向量和一个充满小部件的QVBoxLayout。用C++ 从矢量和QVBoxLayout中删除,c++,qt,vector,C++,Qt,Vector,我使用QT,有一个向量和一个充满小部件的QVBoxLayout。用Add按钮填充这两个按钮是没有问题的,但是删除它们并不能真正起作用 如果我从最后一个到第一个删除小部件,一切正常,但当我尝试以任何其他方式删除它们时,一切都失败了。也许有人有主意 void listwindow::remove_entry() { vector<todo_list_entry *>::iterator pos; int i=0; for (pos=list_entrys_vector.begin
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++;
}
}
void listwindow::remove_entry()
{
向量::迭代器位置;
int i=0;
for(pos=list_entrys_vector.begin();posremoveWidget(*pos);
listenLayout->update();
列表入口向量擦除(pos);
删除列表项向量[i];
打破
}
i++;
}
}
在对向量元素进行迭代时,对向量元素使用erase
可能会导致迭代器无效。一旦执行list\u entrys\u vector.erase(pos)
,pos
不再是一个有效的迭代器,因此当您下次尝试在循环中使用它时,会发生不好的事情。不要在迭代过程中对向量的每个单独元素使用擦除,而是等到结束时,使用list\u entrys\u vector.clear()立即擦除它们
或者,如果您不想删除所有条目,可以使用remove\u 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给了我一些麻烦le…如果我添加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;
}
}
void listwindow::remove_entry()
{
向量缓冲区;
向量::迭代器位置;
对于(pos=list_entrys_vector.begin();pos!=list_entrys_vector.end();){
如果((**pos).选中_delete()==true){
删除*pos;
pos=列表入口向量擦除(pos);
listenLayout->removeWidget(*pos);
listenLayout->update;
}
否则{
++pos;
}
}
编辑:
改变了顺序(先移除Widget,然后删除),现在一切都很好