我有一个树视图,并希望在选择更改时收到通知。回调的签名是什么?
我找到了一个代码片段,如:
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如何交互。一个例子的每个链接都非常受欢迎!
答案 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。