You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:15:06