0

私のアプリケーションには、単一選択モードの GtkIconView があります。選択したアイテムのテキストを取得したい(そして、それをさらに下に進めたい)。現在、動作するコードがいくつかありますが、実際に GtkTreePath を取得するとプログラムがクラッシュします (segfault)。

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: これは簡略化されたバージョンです。2 つのソース ファイル、1 つのグレード ファイル、サンプル イメージ、および compile コマンドを含む readme ファイルが含まれています。Valac v0.16、GTK+ 3.0、および GModule 2.0 が必要です (さらに削除することもできますが、要点が抜けているだけです。これらは製品コードで必要になります)。まだセグメンテーション違反。

4

1 に答える 1

1

問題は、on_filter_selectedの署名が、接続されているシグナルと一致しないことです(GtkIconView :: item-activate、またはValadocを使用する場合はGtk.IconView.item_activate)。あなたが持っている

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 に答える