0

在我的应用程序中,我有一个具有单选模式的 GtkIconView。我想获取所选项目的文本(并进一步采取行动)。现在,我有一些我可以使用的代码,但是 GtkTreePath 的实际获取会使程序崩溃(段错误)。

Program received signal SIGSEGV, Segmentation fault.
0x0804d350 in minkovsky_ufilter_ufilter_window_on_filter_selected (
    e=0x8172010, self=0x8354d80)
    at /home/filip/ufilter/src/UfilterWindow.vala:281
281               TreePath item = filterchooser.get_selected_items().data;

你能告诉我为什么会发生(以及如何解决它)吗?

谢谢。

编辑:我做了更多的测试,但仍然没有定论。也就是说,我想检查是否get_selected_items()返回 null (导致问题),但它只是在新的地方再次出现了段错误。这是代码:

    [CCode (instance_pos = -1)]
    public void on_filter_selected (Event e) {

        if(filterchooser.get_selected_items() == null){ // <-- Now happens here
            stderr.printf("Null!");
            return;
        }

        TreePath item = filterchooser.get_selected_items().data; // <-- Used to happen here
        TreeIter iter;
        string selection;
        filterchooser_liststore.get_iter(out iter, item);
        filterchooser_liststore.get(iter, 0, out selection);
        stderr.printf("Selected filter: %s\n", selection);
    }

编辑 2:这是精简版。它包含:两个源文件、一个glade 文件和示例图像,以及一个带有编译命令的自述文件。您将需要 Valac v0.16、GTK+ 3.0 和 GModule 2.0(我本可以进一步精简它,但它只是忽略了一点:生产代码中需要这些)。仍然是段错误。

4

1 回答 1

1

问题是您的 on_filter_selected 签名与其连接的信号不匹配(GtkIconView::item-activated,如果您更喜欢 Valadoc,则为 Gtk.IconView.item_activated )你有

public void on_filter_selected (Event e) ...

但它应该是这样的

public void on_filter_selected (Gtk.IconView view, Gtk.TreePath path) {
  Gtk.TreeIter iter;
  string selection;

  GLib.return_if_fail (filterchooser_liststore.get_iter (out iter, path));
  filterchooser_liststore.get (iter, 1, out selection);
  GLib.stderr.printf ("Selected filter: %s\n", selection);
}
于 2012-07-16T00:46:12.463 回答