gtkmm中树视图选择回调的签名和功能

时间:2014-08-27 12:50:07

标签: treeview gtkmm

我有一个树视图,并希望在选择更改时收到通知。回调的签名是什么?

我找到了一个代码片段,如:

Gtk::TreeView *treeview = Gtk::manage(new Gtk::TreeView);
Glib::RefPtr< Gtk::TreeSelection > sel = treeview->get_selection();
sel->set_mode(  Gtk::SELECTION_MULTIPLE );
sel->set_select_function(sigc::ptr_fun(&SelFun));

但我无法找到关于SelFun的任何信息!

  • 签名如何
  • 如何找出在此功能中选择了哪些行和列?
  • 如何使用该对象访问模型中的数据

是的,我实际上不知道TreeView / Model / Path / Selection如何交互。一个例子的每个链接都非常受欢迎!

1 个答案:

答案 0 :(得分:0)

您似乎想要多重选择。我也有同样的问题。启用多重选择后,获取选定的行会更困难一些。获取它们的方法略有不同。

我将提供最通用的方法。首先,在启用多个选择后,需要重载signal_changed()信号。然后,将TreeView的TreeSelection分配给RefPtr以便于访问。

Glib::RefPtr<Gtk::TreeSelection> TreeView_TreeSelection;
TreeView_TreeSelection = your_TreeView.get_selection();

接下来,将TreeSelection连接到signal_changed()信号。

TreeView_TreeSelection -> signal_changed().connect(sigc::mem_fun(your_TreeView,
  &your_Class::on_selection_changed));

现在,确保在名为on_selction_changed()的“your_Class”中创建一个void函数头或任何你想要的。只需确保将上面连接中的名称更改为您的班级名称。 最后一步是制作这个功能。下面是一个简单的示例,获取所选行的所有TreePath的向量,然后将这些TreePath转换为TreeModel :: Row指针的向量。

void your_Class::on_selection_changed()
{

  if((TreeView_TreeSelection -> count_selected_rows()) == 0)
  {

     return;

  }

  vector<Gtk::TreeModel::Path> selected_rows = TreeView_TreeSelection -> get_selected_rows();

  vector<Gtk::TreeModel::Row*> selected_TreeRows;  

  vector<Gtk::TreeModel::Path>::iterator TreePath_iterator = selected_rows.begin();

  Gtk::TreeRow *row;

  while(TreePath_iterator != selected_rows.end()
  {

    selected_row_it = p_TreeModel -> get_iter(TreePath_iterator);

    row = (*selected_row_it);

    selected_TreeRows.push_back(row);

    TreePath_iterator++;

  }

}

你知道如何使用类似STL的包含API的TreeModel的child()来迭代TreeModel吗?它最有用的是迭代TreeModel的所有行或获取TreeModel的大小(AKA行计数)。它的使用取决于您使用的是ListStore,TreeStore还是自定义TreeModel。