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

时间:2014-08-29 10:59:13

标签: c++ gtkmm

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

以下代码剪辑有效,但我不知道我必须调用哪个类来删除所选元素。

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选择。

1 个答案:

答案 0 :(得分:0)

据我所知,主要问题是MULTIPLE选择 - 如果只有一个项目,那么它很简单:

get_model()->erase(iter);

问题出在那之后;其余的迭代器变得无效。

每行是否有任何唯一ID?如果是,则可以使用:

  1. 将所有ID存储在容器中
  2. 转到所有项目并删除存储的
  3. 类似的东西:

    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。