3

如何连接到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 的双击要求之外,该程序完全按照我的意愿工作。

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 回答