如果选择了多行,则c-gtk_tree_selection_get_selected_rows方法返回具有NULL路径的



我正在尝试实现在单击按钮时删除GtkTreeView小部件中所选行的功能。功能如下:

static void delete_selected_rows(GtkButton *activated, GtkTreeView *tree_view) {
GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(tree_view);
GtkTreeModel *model;
GList *selected_list = gtk_tree_selection_get_selected_rows(tree_selection, &model);
for (size_t i = 0; i < g_list_length(selected_list); i++) {
GtkTreeIter iter;
GtkTreePath *path = selected_list[i].data;
gtk_tree_model_get_iter(model, &iter, path);
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
}
g_list_free_full(selected_list, (GDestroyNotify) gtk_tree_path_free);
}

当选择1行时,它工作得很好,但当选择2行或更多行时,gtk_tree_selection_get_selected_rows返回列表,其中指向GtkTreePath的一些指针是NULL。它会导致分段故障导致崩溃。

所以,我试图找出是我做错了什么,还是gtk4中的错误。如有任何帮助,我们将不胜感激。

我想明白了。我把GList当作一个数组,而不是一个链表,这很愚蠢。我纠正了它,改变了循环,崩溃消失了。但是,删除2个以上选定的行没有按预期工作。删除后仍保留了几个选定的行。解决方案是从最后一个GList元素迭代到第一个,这样在每次删除后,较低行的树路径就不会更改。以下是有效的解决方案:

static void
delete_selected_rows (GtkButton * activated, GtkTreeView * tree_view)
{
GtkTreeSelection * selection = gtk_tree_view_get_selection (tree_view);
GtkTreeModel *model;
GList * selected_list = gtk_tree_selection_get_selected_rows (selection, &model);
GList * cursor = g_list_last (selected_list);
while (cursor != NULL) {
GtkTreeIter iter;
GtkTreePath * path = cursor->data;
gtk_tree_model_get_iter (model, &iter, path);
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
cursor = cursor->prev;
}
g_list_free_full (selected_list, (GDestroyNotify) gtk_tree_path_free);
}

最新更新