2014-08-29 123 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。