3

行が選択されたときに通知を受けるように、 Gtk.TreeViewのシグナルに接続するにはどうすればよいですか?現在、row_activateシグナルに接続していますが、これには行をダブルクリックする必要があり、シングルクリックで通知を受け取りたいです。

プログラム例:

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_activateのダブルクリック要件を除いて、私が望むとおりに機能します。

4

2 に答える 2

7

TreeSelectionの変更されたtree.get_selection()シグナルがあります(を使用して取得します)。これは、cursor_changedと比較して正しい方法である必要があります。

于 2011-08-25T11:57:32.403 に答える
0

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

この関数は、TreeViewオブジェクトのget_selection()メソッドを使用して、TreeSelectionオブジェクトを取得できます。set_modeメソッドを使用して、選択モードを単一選択に設定します。次に、 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();

}
于 2011-08-25T11:09:51.743 に答える