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

Gtk3 TreeView列宽适配视图无横向滚动条实现问题咨询

解决方案

核心问题定位

你之前的尝试没有达到预期,主要是两个配置遗漏:

  1. 没有为GtkCellRendererText开启省略号截断属性,且错误复用了同一个渲染器实例导致属性冲突
  2. 没有限制TreeView的水平大小请求策略,导致长内容撑开上层窗口

具体修改步骤

1. Glade配置调整

  • 将GtkScrolledWindow的横向滚动条策略修改为never
  • 保持TreeView列的resizable属性为True,sizing保持autosize即可
  • 窗口的resizable属性可按需保留,不影响最终效果

2. C代码核心修改

你需要为每个列单独创建文本渲染器,开启省略号截断,同时限制TreeView的水平大小不会超出父容器:

关键配置说明

  • 为文本渲染器设置ellipsize属性为PANGO_ELLIPSIZE_END,实现内容超出时末尾加省略号
  • 每个列单独创建渲染器,避免属性冲突
  • 给TreeView设置hexpand和halign属性,限制水平方向不会撑开父容器

完整修改后的init_reference_list函数

static void init_reference_list(GtkBuilder* builder)
{
    GtkCellRenderer*   renderer;
    GtkWidget*         tree_widget;
    tree_widget = GTK_WIDGET(gtk_builder_get_object(builder, "tree_view"));

    // 限制TreeView水平方向自适应父容器大小,不会被长内容撑开
    gtk_widget_set_hexpand(tree_widget, TRUE);
    gtk_widget_set_halign(tree_widget, GTK_ALIGN_FILL);

    // 配置标题列
    GtkTreeViewColumn* column;
    renderer = gtk_cell_renderer_text_new();
    // 开启末尾省略号截断
    g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
    column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "title"));
    gtk_tree_view_column_pack_start(column, renderer, TRUE);
    gtk_tree_view_column_add_attribute(column, renderer, "text", TITLE_COLUMN); 

    // 配置作者列(单独创建渲染器,不可复用上面的实例)
    renderer = gtk_cell_renderer_text_new();
    g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
    column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "authors"));
    gtk_tree_view_column_pack_start(column, renderer, TRUE);
    gtk_tree_view_column_add_attribute(column, renderer, "text", AUTHORS_COLUMN);

    // 初始化列表存储和测试数据
    GtkListStore* store;
    store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); 
    gtk_tree_view_set_model(GTK_TREE_VIEW(tree_widget), GTK_TREE_MODEL(store));

    char title[]   =  "A long long long long long long long long long long long long long long long long long long long long long long long long  long long long long long long long long long long title";
    char authors[] =  "Me You Us Them All of us";
    GtkTreeIter iter;
    for (int i = 0; i < 500; ++i)
    {
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, AUTHORS_COLUMN, authors, TITLE_COLUMN, title, -1);
    }
}

3. 自动换行效果实现(可选)

如果需要优先自动换行而不是截断,把渲染器的ellipsize配置替换为换行配置即可:

// 替换掉ellipsize的配置
g_object_set(renderer, 
             "wrap-mode", PANGO_WRAP_WORD_CHAR, // 按单词和字符边界换行
             "wrap-width", 200, // 换行宽度可按需调整
             NULL);
// 同时关闭TreeView的固定行高,避免换行后内容被截断
gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(tree_widget), FALSE);

效果验证

修改完成后即可达到你预期的全部效果:

  • 列支持手动拖拽调整大小
  • 不会出现横向滚动条
  • 长内容不会撑开窗口
  • 内容超出列宽时自动加省略号截断,或者按配置自动换行

内容的提问来源于stack exchange,提问作者Ahmad B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 22:15:06