排序
标准树模型(TreeStore和ListStore)派生自TreeSortable,因此它们提供了排序功能。例如,调用set_sort_column()按指定的列对模型进行排序。或者向set_sort_func()提供一个回调函数以实现更复杂的排序算法。
- 10.5.1. 单击列进行排序
- 10.5.2. 对同一模型进行独立排序的视图
10.5.1. 单击列进行排序
为了使用户可以点击TreeView的列标题以对TreeView内容进行排序,请在需要此功能的列上调用Gtk::TreeView::Column::set_sort_column(),以提供此功能。如下所示:
auto pColumn = treeview.get_column(0); if(pColumn) pColumn->set_sort_column(m_columns.m_col_id);
10.5.2. 对同一模型进行独立排序的视图
TreeView可以让你用两个TreeView部件显示同一个TreeModel。如果你需要让这这些树形视图对模型进行不同的排序,则你应该使用TreeModelSort而不仅仅是使用Gtk::TreeViewColumn::set_sort_column()。TreeModelSort是一个包含其他模型的模型,其提供了该模型的将已排序版本。你可以如下所示的将已排序版本模型添加到TreeView:
auto sorted_model = Gtk::TreeModelSort::create(model); sorted_model->set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING); treeview.set_model(sorted_model);
请注意,这样做树形视图将会提供已排序模型的迭代器。你必须将其转换为基础的子模型迭代器以便对这个模型进行操作。例如:
void ExampleWindow::on_button_delete() { auto refTreeSelection = m_treeview.get_selection(); if(refTreeSelection) { auto sorted_iter = m_refTreeSelection->get_selected(); if(sorted_iter) { auto iter = m_refModelSort->convert_iter_to_child_iter(sorted_iter); m_refModel->erase(iter); } } }