2014-08-29 153 views
0

我想從樹視圖或基礎模型中刪除選定的行。如何從選定的樹視圖中刪除/刪除行

下面的代碼片斷工作,但我不知道哪個類的函數,我必須調用刪除選定的元素。

std::vector<Gtk::TreeModel::Path> pathlist; 
pathlist = get_selection()->get_selected_rows(); 


for (std::vector<Gtk::TreeModel::Path>::iterator it = pathlist.begin(); it!=pathlist.end(); it++) 
{ 
    Gtk::TreeModel::iterator iter = get_model()->get_iter(*it); 
    Gtk::TreeModel::Row row = *iter; 

    int val; 
    std::string str; 

    row.get_value(0, val); 
    row.get_value(1, str); 

    std::cout << "val " << val << std::endl; 
    std::cout << "String:" << str << std::endl; 
} 

上面的代碼工作正常。

現在我想刪除所選的元素! 注意:MULTIPLE選擇被激活。

回答

0

據我瞭解,主要的問題是多重選擇 - 如果你只有一個項目,然後很簡單:

get_model()->erase(iter); 

的問題是之後;迭代器的其餘部分變得無效。

你有每行的唯一ID嗎?如果是,那麼你可以使用:

  1. 儲存在容器中的所有ID
  2. 去THROU所有項目,並刪除存儲

類似的東西:

std::vector<Gtk::TreeModel::Path> pathlist; 
pathlist = get_selection()->get_selected_rows(); 

std::set<int> IDs; 

for (std::vector<Gtk::TreeModel::Path>::iterator it = pathlist.begin(); it!=pathlist.end(); it++) 
{ 
    Gtk::TreeModel::iterator iter = get_model()->get_iter(*it); 
    iter->get_value(ID, id); 

    IDs.insert(id); 
} 

auto iter = get_model()->erase(get_model()->get_iter(*pathlist.begin()); 
while (iter) 
{ 
    int id; 
    iter->get_value(ID, id); 
    if (IDs.find(id) != IDs.end()) { 
     iter = get_model()->erase(iter); 
    else 
     ++iter; 
} 

還是什麼像那樣。對不起,我不記得整個API。

我假設從模型中擦除行也改變PATH。