gpt4 book ai didi

c - 从 Gtk TreeStore 中删除行时出错

转载 作者:行者123 更新时间:2023-11-30 15:20:23 34 4
gpt4 key购买 nike

我有一个用于从列表存储中删除单独选定的行的函数,但每次调用它时,都会收到一条错误消息:

Gtk-CRITICAL **: gtk_list_store_remove: assertion `iter_is_valid (iter, list_store)' failed

这是函数:

void delete_row()
{

selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
gtk_tree_selection_get_selected(selector, &model, &iter);
gtk_list_store_remove(GTK_LIST_STORE(store), &iter);

}

选择模式设置为单一。我在不同的函数中使用相同的模型和迭代器,没有任何问题。

我是否以正确的方式处理这件事?我的代码基于以下教程:

http://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Events

** 编辑 **

注意:我还尝试使用 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); ,它给出了相同的错误。

声明( header 的全局范围):

GtkTreeView *treeview;
GtkTreeModel *model;
GtkTreeIter iter;
GtkListStore *store;
GtkTreeSelection *selector;
GtkMenuItem *delete_row_item;

初始化树相关结构:

//Load tree and list related structures.
treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview"));
selector = GTK_TREE_SELECTION(gtk_builder_get_object(builder, "treeview-selection"));
store = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore"));
//Set the tree model
model = gtk_tree_view_get_model(treeview);

从glade文件中获取删除菜单项并将其连接到函数:

delete_row_item = gtk_builder_get_object(builder, "delete");
g_signal_connect(delete_row_item, "activate", G_CALLBACK(delete_row), NULL);

最佳答案

这可能与它有任何关系,也可能没有任何关系,但我认为值得一提:

你这是在玩火!全局变量是危险的,特别是在使用事件的环境中,例如 gtk。

您存储在全局变量中的参数很可能会被另一个事件更改。特别危险的是 iter,它很可能在多个地方使用。您确实应该在函数中使用局部变量(分别在每个函数中):

void delete_row()
{
GtkTreeView *treeview;
GtkTreeModel *model;
GtkTreeIter iter;

treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview"));
selector = gtk_tree_view_get_selection(treeview);
gtk_tree_selection_get_selected(selector, &model, &iter);
gtk_list_store_remove(GTK_LIST_STORE(store), &iter);

}

另外,请注意,您已经定义了一个列表存储和一个可能会引起困惑的模型:

 GtkTreeModel *model;
GtkListStore *store;

两者都指向一个模型(liststore只是模型的一个特例)不要混合两者 - 请注意!

事实上,我刚刚注意到您实际上在删除功能中混合使用了存储和模型:

gtk_tree_selection_get_selected(selector, &model, &iter); gtk_list_store_remove(GTK_LIST_STORE(store), &iter);

关于c - 从 Gtk TreeStore 中删除行时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30042311/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com