Я использую GTK 3 на macOS. Я хочу перебрать GtkListStore.
У меня есть следующий код:
...
GtkListStore *listStore = gtk_list_store_new(N_COLUMNS, // 2
G_TYPE_LONG, // quantity
G_TYPE_STRING); // name
// I stripped some lines but I have some `gtk_list_store_append` and `gtk_list_store_set` elsewhere.
gtk_tree_model_foreach(GTK_TREE_MODEL(listStore), foreach_func, NULL);
gboolean foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) {
gchar *name, *tree_path_str;
glong quantity;
gtk_tree_model_get(model, iter,
QTY_COLUMN, &quantity,
NAME_COLUMN, &name,
-1);
tree_path_str = gtk_tree_path_to_string(path);
g_print("Row %s: %ld %s\n", tree_path_str,
quantity, name);
g_free(tree_path_str);
g_free(name);
return FALSE;
}
У меня есть ошибка в этой строке:
gtk_tree_model_foreach(GTK_TREE_MODEL(listStore), foreach_func, NULL);
Ошибка:
gtk_tree_model_foreach: assertion 'GTK_IS_TREE_MODEL (model)' failed
Прототип gtk_tree_model_foreach:
void
gtk_tree_model_foreach (GtkTreeModel *model,
GtkTreeModelForeachFunc func,
gpointer user_data);
Так что в моем коде полученный model
не является GtkTreeModel
. Дело в том, что я бросил свой GtkListStore
на GtkTreeModel
с GTK_TREE_MODEL(listStore)
.
Я здесь потерян, что мне не хватает?
РЕДАКТИРОВАТЬ: ОК, оказывается, этот код действителен, ошибка была в другом месте. Я сделал ошибку в прототипе функции, которую я вызываю с помощью g_signal_connect. Это делает мой listStore NULL, поэтому приведение к GtkTreeModel работало, но все равно было NULL, что не понравилось GTK_IS_TREE_MODEL.
Подробнее здесь: https://mstdn.io/@angristan/102078459015470376