GTK 3.0 如何在TreeView列中添加系统主题自带图标
GTK 3 TreeView添加删除图标解决方案
1. 图标名参数说明
你填写的"edit-delete"是正确参数,该名称符合freedesktop.org通用图标命名规范,所有GNOME默认主题都会提供该图标。你的代码报错是其他逻辑不匹配导致的。
2. 现有代码的核心问题
- 类型不匹配:你给
GtkCellRendererPixbuf绑定的是gicon属性,该属性接收GIcon*类型的值,但你加载并存储的是GdkPixbuf*类型,二者不兼容。 - 参数错误:
gtk_list_store_set调用中多余的FALSE参数会破坏「列ID-值」的成对结构,引发内存错误。
3. 完整正确实现方案
我们采用更简单的pixbuf属性适配方案,无需修改图标加载逻辑,只需要调整列绑定和存储逻辑即可:
3.1 修改TreeView第三列绑定代码
GtkCellRenderer *rendererDelete; GtkTreeViewColumn *columnDelete; rendererDelete = gtk_cell_renderer_pixbuf_new(); // 将绑定属性从gicon改为pixbuf,匹配GdkPixbuf类型 columnDelete = gtk_tree_view_column_new_with_attributes("Delete", rendererDelete, "pixbuf", DELETE_ICON, NULL);
注意:需要确认你的GtkListStore中DELETE_ICON列的类型设置为GDK_TYPE_PIXBUF
3.2 图标加载代码(增加错误判断)
GError *error = NULL; GdkPixbuf *delete_icon = gtk_icon_theme_load_icon( gtk_icon_theme_get_default(), "edit-delete", // 该参数为标准删除图标名,无需修改 GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_USE_BUILTIN, &error); if (!delete_icon) { g_warning("删除图标加载失败:%s", error->message); g_error_free(error); }
3.3 写入列表存储的代码
gtk_list_store_set(list_store, &iter, ACCOUNT_NUMBER, local_account->number, DESCRIPTION, local_account->description, DELETE_ICON, delete_icon, -1); // 释放pixbuf的本地引用,列表存储会自动持有一份引用,避免内存泄漏 if (delete_icon) g_object_unref(delete_icon);
4. 可选扩展:点击图标触发删除
如果需要点击删除图标实现删除行逻辑,添加以下代码即可:
// 设置渲染器可点击 g_object_set(rendererDelete, "activatable", TRUE, NULL); // 绑定点击信号 g_signal_connect(rendererDelete, "clicked", G_CALLBACK(on_delete_clicked), tree_view);
在回调函数on_delete_clicked中获取当前选中行的索引,调用gtk_list_store_remove完成删除操作即可。
内容的提问来源于stack exchange,提问作者9-Pin
相关产品推荐
相关产品推荐

