0

が付いたアプリケーション(ここで機能するsscceコード)があります。行が選択されるたびに、コールバックが呼び出されます。このコールバックは、選択された行を取得し、そのデータを何らかの方法で処理する必要があります。GtkTreeView

私のアプリケーションは、このツリービュー自体のいくつかの行を選択する必要がある場合があります。

// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

これは、最上位の線、つまりルートから直接下がる線を選択する必要がある場合にうまく機能します。ただし、子行(たとえば、3行目の最初の子行)を選択しようとすると、コールバック関数でエラーが発生しました(ここではsscceコード、42行目でのみ変更)。

// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "2:0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

エラーは、次の警告とそれに続くセグメンテーション違反です。

(treetest:1843):Gtk-CRITICAL **:gtk_tree_store_get_path:アサーション `iter-> user_data!=NULL'が失敗しました

(treetest:1843):Gtk-CRITICAL **:IA__gtk_tree_model_get_string_from_iter:アサーション `path!=NULL'が失敗しました

また、マウスで同じ行を選択しても、このエラーは発生しません。

どうして?選択されたパス"2:0"は有効ですが、選択から返されたiterは有効ではないため、行が選択されていないと思います。なんで?

4

1 に答える 1

2

問題は、トップレベルの行が折りたたまれていることです。その子の行は非表示になっているため、選択できません。

解決策は、子の1つを選択する前に親行をプログラムで展開することです(ここではsscceコード)。

// Expanding
GtkTreePath *path = gtk_tree_path_new_from_string("2");
gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE);
// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "2:0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

もちろん、このエラーは、プログラムで行を選択したときに発生します。これは、折りたたまれた行の子をクリックして選択することができないためです。

于 2012-07-18T14:29:22.883 に答える