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

Posted

技术标签:

【中文标题】gtkmm 中树视图选择回调的签名和功能【英文标题】:signature and functionality of selection callback of treeview in gtkmm 【发布时间】:2014-08-27 12:50:07 【问题描述】:

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

我找到了一个类似sn-p的代码:

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】:

您似乎想要多选。我也有同样的问题。一旦启用了多重选择,获取选定的行就有点困难了。获取方式略有不同。

我将提供最通用的方法。首先,您需要在启用多项选择后重载 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 函数头或任何您想要的。只需确保将上面连接中的名称更改为您的班级名称即可。 最后一步是制作函数。这是一个简单的示例,它获取所选行的所有 TreePaths 的向量,然后将这些 TreePaths 转换为 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 的 children())来遍历 TreeModel?它对于遍历 TreeModel 的所有行或获取 TreeModel 的大小(AKA 行数)最有用。它的使用取决于您使用的是 ListStore、TreeStore 还是自定义 TreeModel。

【讨论】:

抱歉,无法编译您的代码。我缺少:p_TreeModel 定义和初始化以及 selected_row_it 定义和初始化。我对树、树视图、行、树行、树行迭代器完全感到困惑……哇!仅从选择中获取数据.... :-) 对不起。 p_TreeModel 应该只是一个 Gtk::ListStore,我假设你正在使用它。每个 TreeView 都必须使用 TreeModel。它是保存 TreeView 数据的东西。我建议使用本指南来了解如何使用 TreeView。您需要从 Gtk::TreeView 派生您的类,如下面的指南详细信息。明天有空我会改进这个例子https://developer.gnome.org/gtkmm-tutorial/unstable/chapter-treeview.html.en

以上是关于gtkmm 中树视图选择回调的签名和功能的主要内容,如果未能解决你的问题,请参考以下文章

将 css 样式应用于 Gtk::ToolButton 不适用于 gtkmm 中的选择器

gtkmm 和系统剪贴板

React Native中树 TreeView 实现

签约“Runner”需要开发团队。在签名和功能编辑器中选择一个开发团队

Gtkmm3 TreeView ListStore.Clear 或 TreeSelection.unselectAll 导致错误

Flutter - 在列表视图中仅选择单个项目