向GTKTreeView添加行时的Segfault

时间:2017-03-27 13:33:01

标签: c++ iterator segmentation-fault gtk 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);

我想要做的是将迭代器移动到下一行,这样我就可以插入另一行值。但是,最后一行会导致段错误。这是为什么?

1 个答案:

答案 0 :(得分:1)

必须在行之间重置迭代器,但更好的方法是使用gtk_list_store_set而不是set_value。 我的解决方案是:

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

}

因此,每次插入行时都会重新创建迭代器。