从矢量和 QVBox布局中删除
Deleting from vector and QVBoxLayout
我使用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;
}
}
编辑: 更改了顺序(首先删除小部件,然后删除)现在一切正常!
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 如何使用C/C++在MacOSX中获得键盘布局
- 删除指向指针的指针是运行时错误吗
- 如何从布局中删除多行?
- 如何从主布局中删除所有项目
- Qt 删除嵌套布局
- 从矢量和 QVBox布局中删除
- 如何获得QVBoxLayout合同QDialog时,删除子布局
- 在不删除部件的情况下清除布局