如何从树视图的选择中删除/擦除行

How to remove/erase rows from a selection of a tree view

本文关键字:删除 擦除 选择 视图      更新时间:2023-10-16

我想从树视图或底层模型中删除选定的行。

下面的代码很有效,但我不知道我必须调用哪个类的哪个函数来删除所选的元素。

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;
}

上面的代码运行良好。

现在我想删除已选定的元素!注意:多选已激活。

我知道主要问题是多重选择-如果你只得到一个项目,那么很简单:

get_model()->erase(iter);

问题就在那之后;其余迭代器将变为无效。

每一行都有唯一的ID吗?如果是,那么你可以使用:

  1. 将所有ID存储在容器中
  2. 浏览所有项目并删除存储的

类似的东西:

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。