2011-08-25 3 views
2

Gtk.TreeView의 신호에 어떻게 연결하여 행을 선택할 때 통보받을 수 있습니까? 현재 row_activated 신호에 연결하고 있지만 행을 두 번 클릭해야하며 한 번의 클릭으로 알림을 받고 싶습니다.treeview (liststore) 행을 선택하면 어떻게 알림을받을 수 있습니까?

예제 프로그램 : 나는 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(); 

} 

이 프로그램은 정확하게 작동합니다.

답변

5

cursor_changed에 비해 올바른 방법으로해야합니다 (이 tree.get_selection()를 사용하여 얻을) TreeSelection의 변경 신호가있다.

0

한 번의 클릭으로 알림을 받으려면 cursor_changed 신호에 연결하십시오. 이렇게하면 콜백 함수에 어떤 변수도 노출되지 않으므로 선택한 항목의 인덱스를 가져 오는 별도의 함수를 정의해야합니다.

이 함수는 TreeView 객체의 get_selection() 메서드를 사용하여 TreeSelection 객체를 가져올 수 있습니다. set_mode 방법을 사용하여 선택 모드를 single selection으로 설정하십시오. get_selected 메서드의 out 매개 변수를 사용하여 TreeModelTreeIter을 가져올 수 있습니다. 이 함수의 반환 값을 확인해야합니다. 선택되어 있으면 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

관련 문제