选择

要找出用户选择了那些行,请从TreeViewGtk::TreeView::Selection对象获取。

auto refTreeSelection = m_TreeView.get_selection();

10.4.1. 单选或多选

默认情况下,只能选定一行,但是你可以通过设置选择模式选择多行,如下所示:

refTreeSelection->set_mode(Gtk::SELECTION_MULTIPLE);

10.4.2. 选定的行

对于单选模式,你可以如下所示调用get_selected()

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

对于多选模式,你需要调用get_selected_rows()或者定义一个回调然后将其传递给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::const_iterator& iter)
{
  auto row = *iter;
  //Do something with the row.
}

10.4.3. "changed"信号

要响应用户单击某行或者某个范围的行,请按以下方式连接信号:

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

10.4.4. 防止行被选择

或许用户不应该能选择列表或树中的每个项目。例如在gtk-demo中,你可以选择一个演示来查看他的源代码,但是你选一个演示类别没有意义。

要控制一个行是否能被选择,请使用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 auto iter = model->get_iter(path);
  return iter->children().empty(); // only allow leaf nodes to be selected
}

10.4.5. 修改选择

要更改选择,请指定Gtk::TreeModel::iteratorGtk::TreeModel::Row,然后如下所示:

auto row = m_refModel->children()[5]; //The sixth row.
if(row)
  refTreeSelection->select(row.get_iter());

或者

auto iter = m_refModel->children().begin()
if(iter)
  refTreeSelection->select(iter);