2017-03-27 12 views
2
GtkWidget *tree_view; 
GtkListStore *tree_store; 
GtkTreeModel *tree_model; 
tree_store = gtk_list_store_new(4, G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_FLOAT); 
tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tree_store)); 
GtkTreeIter iter; 
gtk_list_store_append(tree_store, &iter); 

for(int j = 0; j < 2; j++) { 
    GValue value = {0}; 
    g_value_init(&value, G_TYPE_STRING); 
    g_value_set_string(&value, "1.0"); 
    gtk_list_store_set_value(tree_store, &iter, j, &value); 
} 
gtk_tree_model_iter_next(tree_model, &iter); 

私がしようとしているのは、別の行の値を挿入できるようにイテレータを次の行に移動することです。しかし、最後の行はsegfaultになります。どうしてこれなの?GTKTreeViewに行を追加するときのSegfault

+0

エラー全体を貼り付けることができます – TheGameiswar

+1

@TheGameiswarセグメンテーションフォールト(コアダンプされたもの) –

+0

うーん..しばらくしていましたが、コレクションのアイテムを追加/削除するときにイテレータに注意する必要があることをはっきりと覚えておいてください。変更が行われた後は有効ではありません。 http://stackoverflow.com/questions/6438086/iterator-invalidation-rules – Rob

答えて

1

イテレータは行間でリセットする必要がありますが、より良い方法はset_valueではなくgtk_list_store_setを使用することです。 私の解決策はこれです:

for(int i=0; i<num_rows; i++) { 
    GtkTreeIter iter; 
    gtk_list_store_append(tree_store, &iter); 
    for(int j = 0; j < 2; j++) { 

      GValue value = {0}; 
      g_value_init(&value, G_TYPE_STRING); 
      g_value_set_string(&value, "1.0"); 
      gtk_list_store_set(tree_store, &iter, j, "1.0", -1); 
      gtk_list_store_set(tree_store, &iter, j, "1.0", -1); 
    } 

} 

だから、イテレータは行が挿入されるたびに再作成されます。

関連する問題