0

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

我遇到的问题是无法在TreeView使用 时将编辑翻译TreeModelFilter成对子模型的编辑,即ListStore.

单元格 ( CellRendererText) 编辑的 signal_connect 如下所示:

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 中搜索编辑 TreeViews 时发现的,因为我通常是 GTK2 和 GUI 新手。

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

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

4

1 回答 1

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。我将发布一个新版本,它有一个很棒的列表视图/树视图,在那里你有一个更简单(和更多红宝石)的 api。Gtk 的东西变得非常复杂。

于 2012-03-14T20:02:21.133 回答