如何编辑TreeModelFilters子模型?

时间:2012-03-14 16:37:21

标签: ruby gtk2

我目前正在尝试根据文本框的输入过滤TreeView,同时仍允许用户编辑TreeView的单元格。

我遇到的问题是,当TreeView使用TreeModelFilter编辑子模型时,ListStore无法翻译编辑,这是CellRendererText

单元格(renderer.signal_connect('edited') do |w, s1, s2| cell_edited(s1, s2, treeview, $status) end def cell_edited(path, str, trvu, cell) if str != "" iter = @store.get_iter(path) iter[cell] = str end end )编辑的signal_connect如下所示:

TreeViewFilter

我承认我会在Gtk2中搜索编辑TreeViews,因为我是一般的GTK2和GUI新手。

如何将ListStore中的路径转换为子模型中的路径({{1}})?

或者更简单地说:当用户在过滤时编辑表格中的单元格时,如何更新列表中正确的未过滤条目?

1 个答案:

答案 0 :(得分:1)

首先,您可以编写如下代码。它更简洁,并检查以确保路径有效:

renderer.signal_connect('edited') do  |ren, path, text|
  next unless iter = @store.get_iter(path)
  iter[$status] = text if text != ""
end

你正在为普通的树视图正确地做所有事情,但是当你创建一个Gtk :: TreeModelFilter时,你需要使用以下命令从过滤后的iter转换为孩子的iter:

的Gtk :: TreeModelFilter#convert_iter_to_child_iter(filter_iter)

http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?Gtk%3A%3ATreeModelFilter

所以你的代码应该是:

renderer.signal_connect('edited') do  |ren, path, text|
  next unless iter = @store.get_iter(path)
  child_iter = @child_store.convert_iter_to_child(iter) 
  child_iter[$status] = text if text != ""
end

你应该看一下visualruby.net。我将发布一个新版本,它有一个很棒的listview / treeview,你可以更容易(更多rubyish)api。 Gtk的东西变得非常复杂。