排序

标准树模型(TreeStoreListStore)派生自TreeSortable,因此它们提供了排序功能。例如,调用set_sort_column()按指定的列对模型进行排序。或者向set_sort_func()提供一个回调函数以实现更复杂的排序算法。

可排序树参考

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

树模型排序参考