我正试图将GSList传递给GtkListStore以向用户显示。但当我将该值设置为GtkListStore时,它只是给了我分段错误。我真的不知道问题在哪里。
我测试了这个列表,所以它不是空的,它有gchar向量,正如预期的那样。
enum {
COLUMN_FILENAME,
NUM_COLUMNS
};
GtkBuilder *builder;
void add_to_source_list(gpointer filename, gpointer list_store) {
GtkTreeIter iterator;
gtk_list_store_append(GTK_LIST_STORE(list_store), &iterator);
// When the program reaches this line it gives segmentation fault
gtk_list_store_set_value(list_store, &iterator, COLUMN_FILENAME, filename);
}
void source_files_list_update() {
GSList *list = file_manager_get_all_sources();
GtkListStore *list_store;
list_store = gtk_list_store_new(NUM_COLUMNS,
G_TYPE_STRING);
GtkTreeView *tree_view;
tree_view = GTK_TREE_VIEW(gtk_builder_get_object(builder, TREE_VIEW_ID));
g_assert_true(tree_view != NULL);
gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(list_store));
GtkCellRenderer *renderer;
renderer = gtk_cell_renderer_text_new();
GtkTreeViewColumn *column;
column = gtk_tree_view_column_new_with_attributes("FILENAME", renderer, "text", COLUMN_FILENAME, NULL);
gtk_tree_view_append_column(tree_view, column);
g_slist_foreach(list, add_to_source_list, list_store);
}
最佳答案
gtk_list_store_set_value()
将GValue
作为其最后一个参数,而不是字符串。在这种情况下,您通常会收到编译器警告,但在本例中filename
仍然是gpointer
,这是void *
,因此编译器假设您做了正确的事情。
修复程序的最简单方法是使用gtk_list_store_set()
。阅读the documentation(无论如何,还是要遵循jcoppens的建议,尽管我不确定在这种情况下是否会有帮助……)。
关于c - GtkListStore添加(段错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30264849/