セレクション

どの行がユーザーに選択されたのかを見つけるには、Gtk::TreeView::SelectionオブジェクトをTreeViewから取得してください。このように:

Glib::RefPtr<Gtk::TreeSelection> refTreeSelection =
m_TreeView.get_selection();

単一、あるいは複数のセレクション

デフォルトでは選択できる行はただひとつだけです。しかし、モードを設定すれば複数のセレクションを許可できます。このように:

refTreeSelection->set_mode(Gtk::SELECTION_MULTIPLE);

選択された行

単一セレクションでは、単にget_selected()を呼ぶだけです。このように:

TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter) //If anything is selected
{
  TreeModel::Row row = *iter;
  //Do something with the row.
}

複数セレクションでは、コールバックを定義し、それを selected_foreach(), selected_foreach_path(), selected_foreach_iter()のどれかに与える必要があります。このように:

refTreeSelection->selected_foreach_iter(
    sigc::mem_fun(*this, &TheClass::selected_row_callback) );

void TheClass::selected_row_callback(const Gtk::TreeModel::iterator& iter)
{
  TreeModel::Row row = *iter;
  //Do something with the row.
}

"changed"シグナル

単一行や複数の行の範囲において、ユーザーのクリック操作に反応するには、シグナルをこのように接続します:

refTreeSelection->signal_changed().connect(
  sigc::mem_fun(*this, &Example_StockBrowser::on_selection_changed)
);

行の選択を禁止する

アプリケーションのリストや木構造で、ユーザーが全てのアイテムを選択できないほうがいい場合があります。例えば、Gtk+のデモではデモのひとつひとつを選択してソースコードを見ることができます。しかし、この場合デモのカテゴリを選択できることに意味はありません。

どの行が選択可能なのか管理するには、set_select_function()メソッドにsigc::slotコールバックを渡して使ってください。例えば:

m_refTreeSelection->set_select_function( sigc::mem_fun(*this, &DemoWindow::select_function) );

このとき

bool DemoWindow::select_function(const Glib::RefPtr<Gtk::TreeModel>& model,
                                 const Gtk::TreeModel::Path& path, bool)
{
  const Gtk::TreeModel::iterator iter = model->get_iter(path);
  return iter->children().empty(); // only allow leaf nodes to be selected
}

セレクションを変更する

セレクションを変更するにはGtk::TreeModel::iteratorGtk::TreeModel::Rowを使って設定してください。このように:

Gtk::TreeModel::Row row = m_refModel->children()[5]; //The fifth row.
if(row)
  refTreeSelection->select(row);

あるいは

Gtk::TreeModel::iterator iter = m_refModel->children().begin()
if(iter)
  refTreeSelection->select(iter);