2012-10-24 122 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,然後刪除)現在一切都很正常!