2011-08-25 2 views
2

Gtk.TreeViewの信号にどのように接続すれば、行が選択されたときに通知されるのですか?現在、私はrow_activated信号に接続していますが、これは行をダブルクリックする必要があり、シングルクリックで通知されたいのです。ツリービュー(リストストア)行が選択されたときに通知を受け取る方法は?

プログラム例:

using Gtk; 

public class MyListView : ScrolledWindow { 
    ListStore list_store; 
    TreeView tree_view; 
    GLib.List<string> list; 

    enum Columns { 
     TEXT, 
     N_COLUMNS 
    } 

    void make_list() { 
     list = new GLib.List<string>(); 
     list.append("Hello World"); 
     list.append("row 2"); 
     list.append("<b>bold</b>"); 
     list.append("<i>italic</i>"); 
     list.append("..."); 
     list.append("etc."); 
    } 

    public MyListView() { 
     make_list(); 
     list_store = new ListStore(Columns.N_COLUMNS, typeof(string)); 
     tree_view = new TreeView.with_model(list_store); 
     var text = new CellRendererText(); 
     var column = new TreeViewColumn(); 
     column.pack_start (text, true); 
     column.add_attribute (text, "markup", Columns.TEXT); 
     tree_view.append_column (column); 
     tree_view.set_headers_visible (false); 
     TreeIter iter; 
     foreach (string item in list) { 
      list_store.append(out iter); 
      list_store.set(
       iter, 
       Columns.TEXT, item 
      ); 
     } 
     this.add(tree_view); 
     tree_view.row_activated.connect(change); 
    } 

    public void change (TreePath path, TreeViewColumn col) { 
     var index = int.parse(path.to_string()); 
     var item = list.nth_data(index); 
     print(index.to_string() + ". " + item + "\n"); 
    } 
} 

public static void main (string[] args) { 

    Gtk.init(ref args); 
    var win = new Window(); 
    win.add(new MyListView()); 
    win.show_all(); 
    win.destroy.connect(Gtk.main_quit); 
    Gtk.main(); 

} 

このプログラムは、私がrow_activatedのダブルクリックの必要性がある場合を除くたいとおりに動作します。

答えて

5

がcursor_changedに比べて正しい方法でなければなりませんTreeSelectionの信号を(tree.get_selection()を使用してそれを得る)、変更あります。

0

ワンクリックで通知を受け取るには、cursor_changedシグナルに接続してください。これは、コールバック関数に変数を公開しないため、選択した項目のインデックスを取得する別の関数を定義する必要があります。

この関数はTreeViewオブジェクトのget_selection()メソッドを使用してTreeSelectionオブジェクトを取得できます。 set_modeメソッドを使用して、選択モードをsingle selectionに設定します。 TreeModelTreeIterは、get_selectedメソッドのoutパラメータを使用して取得できます。この関数の戻り値をチェックする必要があります。何かが選択されている場合はtrueを、何も選択されていない場合はfalseを返します。次に、TreeModelのget_pathメソッドを使用して、選択した項目のTreePathを取得します。

全例:

using Gtk; 

public class MyListView : ScrolledWindow { 
    ListStore list_store; 
    TreeView tree_view; 
    GLib.List<string> list; 

    enum Columns { 
     TEXT, 
     N_COLUMNS 
    } 

    void make_list() { 
     list = new GLib.List<string>(); 
     list.append("Hello World"); 
     list.append("row 2"); 
     list.append("<b>bold</b>"); 
     list.append("<i>italic</i>"); 
     list.append("..."); 
     list.append("etc."); 
    } 

    public MyListView() { 
     make_list(); 
     list_store = new ListStore(Columns.N_COLUMNS, typeof(string)); 
     tree_view = new TreeView.with_model(list_store); 
     var text = new CellRendererText(); 
     var column = new TreeViewColumn(); 
     column.pack_start (text, true); 
     column.add_attribute (text, "markup", Columns.TEXT); 
     tree_view.append_column (column); 
     tree_view.set_headers_visible (false); 
     TreeIter iter; 
     foreach (string item in list) { 
      list_store.append(out iter); 
      list_store.set(
       iter, 
       Columns.TEXT, item 
      ); 
     } 
     this.add(tree_view); 
     tree_view.cursor_changed.connect(change); 
    } 

    public int get_selected() { 
     var selection = tree_view.get_selection(); 
     selection.set_mode(SelectionMode.SINGLE); 
     TreeModel model; 
     TreeIter iter; 
     if (!selection.get_selected(out model, out iter)) { 
      return -1; 
     } 
     TreePath path = model.get_path(iter); 
     return int.parse(path.to_string()); 
    } 

    public void change() { 
     var index = this.get_selected(); 
     if (index >= 0) { 
      var item = list.nth_data(index); 
      print(index.to_string() + ". " + item + "\n"); 
     } 
    } 
} 

public static void main (string[] args) { 

    Gtk.init(ref args); 
    var win = new Window(); 
    win.add(new MyListView()); 
    win.show_all(); 
    win.destroy.connect(Gtk.main_quit); 
    Gtk.main(); 

} 
+1

get_selected()で選択モードを設定しないでください。また、TreePathを解析するのではなく、ListStoreを使用してTreeIterでデータを取得してください。 – lethalman

関連する問題