標準のツリーモデル(TreeStoreとListStore)はTreeSortableから派生しています。ですからどちらもソート機能を使うことができます。例えば、set_sort_column()を呼び出すことで指定した列でモデルをソートできます。あるいは、コールバック関数をset_sort_func()に与えてより複雑なソートアルゴリズムを実装してください。
ユーザーがTreeViewの列ヘッダをクリックして中身をソートできるようにするには、Gtk::TreeViewModel::set_sort_column()を呼び出してください。引数としてヘッダがクリックされたときにソートしたいモデルの列を与えます。例えば:
Gtk::TreeView::Column* pColumn = treeview.get_column(0); if(pColumn) pColumn->set_sort_column(m_columns.m_col_id);
ひとつの同じTreeModelをふたつのTreeViewウィジットで表示することは既にやりました。このような複数のビューのうちのひとつに、他のビューとは違うやりかたでモデルをソートさせたい場合、単なるGtk::TreeViewModel::set_sort_column()などではなく、TreeModelSortを使わなくてはいけません。TreeModelSortはモデルの一種で、もうひとつ別のモデルとしてソートしたバージョンのものを保持できます。例えば、TreeViewオブジェクトにソートしたバージョンのモデルを追加した場合、このようになります:
Glib::RefPtr<Gtk::TreeModelSort> sorted_model = Gtk::TreeModelSort::create(model); sorted_model->set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING); treeview.set_model(sorted_model);
ですが注意してください。TreeViewはソートしたモデルのイテレータを提供できます。モデルに変更を及ぼす場合は、このイテレータを背後にある子モデルのイテレータに変換しないといけません。例えば:
void ExampleWindow::on_button_delete()
{
Glib::RefPtr<Gtk::TreeSelection> refTreeSelection= m_treeview.get_selection();
if(refTreeSelection)
{
Gtk::TreeModel::iterator sorted_iter = m_refTreeSelection->get_selected();
if(sorted_iter)
{
Gtk::TreeModel::iterator iter = m_refModelSort->convert_iter_to_child_iter(sorted_iter);
m_refModel->erase(iter);
}
}
}