Search code examples
c++iteratorsegmentation-faultgtkgtktreeview

Segfault when Adding rows to GTKTreeView


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);

What I'm trying to do is move the iterator to the next row so I can insert another row of values. However, the last line results in a segfault. Why is this?


Solution

  • The iterator must be reset between rows, but the better way is to use gtk_list_store_set as opposed to set_value. My solution is this:

    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);
        }
    
    }
    

    So the iterator is recreated every time a row is inserted.