Ruby 如何编辑TreeModelFilters子模型?

Ruby 如何编辑TreeModelFilters子模型?,ruby,gtk2,Ruby,Gtk2,我目前正在尝试根据文本框的输入过滤TreeView,同时仍然允许用户编辑TreeView的单元格 我遇到的问题是,在使用TreeModelFilter时,无法将TreeView上的编辑转换为子模型(即ListStore上的编辑 单元格(cellRenderText)编辑的信号连接如下所示: renderer.signal_connect('edited') do |w, s1, s2| cell_edited(s1, s2, treeview, $status) end def cel

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

我遇到的问题是,在使用
TreeModelFilter
时,无法将
TreeView
上的编辑转换为子模型(即
ListStore
上的编辑

单元格(
cellRenderText
)编辑的信号连接如下所示:

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
我承认这是我在Gtk2中搜索编辑TreeView时发现的,因为我是Gtk2和GUI的新手

如何将
TreeViewFilter
中的路径转换为子模型中的路径(即
ListStore


或者更简单地说:当用户在筛选表中的单元格时编辑该单元格,如何更新列表中正确的未筛选项?

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

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#将iter转化为child(filter)

因此,您的代码应该是:

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,在那里你有一个更简单(更rubysh)的api。Gtk的东西变得非常复杂。

谢谢!我似乎不得不做一些改动,但之后效果很好。除非iter=需要成为我的过滤器(@filter),而不是存储,否则我所做的更改是下一个更改。convert_iter_to_child_iter(大写表示强调)也需要用于过滤器而不是存储。非常感谢您的帮助,我将查看visualruby.net,因为任何使Gtk更容易/更直观的方法都将非常好!谢谢我今天将上传新版本,其中包含新的listview和treeview内容。让我知道进展如何--E