选择
要找出用户选择了那些行,请从TreeView的Gtk::TreeView::Selection对象获取。
auto refTreeSelection = m_TreeView.get_selection();
- 10.4.1. 单选或多选
- 10.4.2. 选定的行
- 10.4.3. "changed"信号
- 10.4.4. 防止行被选择
- 10.4.5. 修改选择
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 }