0

TreeView現在、テキスト ボックスの入力に基づいてをフィルタリングしようとしてい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とGUIの初心者であるため、Gtk2でTreeViewを編集するための検索を行って見つけたものであることを認めます。

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 に答える