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

如何在GtkTreeView的新单元格中显示两个图标

在GtkTreeView单元格中显示两个图标的实现方法

要在GtkTreeView的单个单元格里显示两个图标,核心思路是利用GtkCellRendererWidget将包含两个图标的容器(比如GtkBox)嵌入单元格,以下是具体实现步骤和代码示例:

实现步骤

  1. 创建数据模型:定义存储两个图标相关数据(如系统图标名、本地路径)的列表模型,为每个图标分配一列。
  2. 使用自定义单元格渲染器:通过GtkCellRendererWidget实现自定义单元格内容,在cell-data信号回调中动态生成包含两个图标的布局容器。
  3. 绑定数据与渲染逻辑:将模型中的数据与单元格的图标渲染关联,确保每行的图标内容与对应数据匹配。

代码示例(GTK4 + Python)

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

class DoubleIconTreeView(Gtk.ApplicationWindow):
    def __init__(self, app):
        super().__init__(application=app, title="双图标TreeView示例")
        self.set_default_size(400, 300)

        # 创建列表模型,两列存储系统图标名称
        self.list_store = Gtk.ListStore(str, str)
        # 添加测试数据
        self.list_store.append(["document-open", "edit-delete"])
        self.list_store.append(["folder", "star"])
        self.list_store.append(["image-x-generic", "share"])

        # 初始化TreeView并绑定模型
        self.tree_view = Gtk.TreeView(model=self.list_store)
        self.set_child(self.tree_view)

        # 创建TreeView列
        icon_column = Gtk.TreeViewColumn("操作图标")
        self.tree_view.append_column(icon_column)

        # 使用CellRendererWidget渲染自定义内容
        renderer = Gtk.CellRendererWidget()
        icon_column.pack_start(renderer, True)

        # 处理cell-data信号,动态生成单元格内容
        def render_cell(renderer, layout, model, iter_, *args):
            # 获取当前行的两个图标名称
            icon1, icon2 = model.get_value(iter_, 0), model.get_value(iter_, 1)
            
            # 创建水平布局容器,放置两个图标
            box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
            
            # 创建第一个图标
            img1 = Gtk.Image.new_from_icon_name(icon1)
            img1.set_icon_size(Gtk.IconSize.SMALL)
            box.append(img1)
            
            # 创建第二个图标
            img2 = Gtk.Image.new_from_icon_name(icon2)
            img2.set_icon_size(Gtk.IconSize.SMALL)
            box.append(img2)

            # 将容器设置为渲染器的内容
            renderer.set_property("widget", box)

        renderer.connect("cell-data", render_cell)

class DoubleIconApp(Gtk.Application):
    def __init__(self):
        super().__init__(application_id="com.example.DoubleIconTreeView")

    def do_activate(self):
        win = DoubleIconTreeView(self)
        win.present()

if __name__ == "__main__":
    app = DoubleIconApp()
    app.run()

关键说明

  • 图标加载方式:示例使用系统图标名加载,若要加载本地图片,替换Gtk.Image.new_from_icon_name为Gtk.Image.new_from_file("本地图片路径")即可。
  • 样式调整:修改GtkBox的spacing参数可调整两个图标间的距离,通过set_icon_size可改变图标尺寸。
  • 动态更新:若需要修改图标内容,直接更新GtkListStore中的数据,TreeView会自动刷新对应行的单元格。

内容的提问来源于stack exchange,提问作者xinlin hou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:40:29