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

如何让GTK3中Entry组件宽度适配窗口宽度?

让GTK3 Entry组件宽度适配窗口宽度的方法

你当前使用的GtkLayout是绝对布局容器,它只会按照指定位置和固定尺寸放置子组件,无法自动随窗口大小调整。要实现Entry宽度适配窗口,需要换成支持自动布局的容器,并配置Entry的扩展属性,具体步骤如下:

修改步骤

  1. 替换容器类型:将GtkLayout替换为水平方向的GtkBox,GtkBox会自动根据窗口尺寸分配子组件的可用空间。
  2. 配置Entry扩展属性:让Entry在水平方向填充所有可用空间。
  3. 移除固定宽度限制:删除gtk_entry_set_width_chars()的调用,避免固定尺寸约束。

修改后的关键代码(bcc.c)

void bcc_init(GtkApplication* app, void *_data){
    (void)_data;
    struct blake_control_center bcc;
    bcc.app=app;
    GdkRectangle workarea = {0};
    gdk_monitor_get_workarea (gdk_display_get_primary_monitor (gdk_display_get_default()), &workarea);

    bcc.gtk_window = GTK_WINDOW (gtk_application_window_new (app));
    // 替换GtkLayout为水平GtkBox,间距设为0
    bcc.layout = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    bcc.entrycompletion = gtk_entry_completion_new();
    bcc.liststore = gtk_list_store_new(1, G_TYPE_STRING);
    bcc.entry = gtk_entry_new();

    gtk_layer_init_for_window (bcc.gtk_window);
    gtk_layer_set_layer (bcc.gtk_window, GTK_LAYER_SHELL_LAYER_BOTTOM);
    gtk_layer_auto_exclusive_zone_enable (bcc.gtk_window);

    // 省略列表填充代码...

    gtk_container_add(GTK_CONTAINER(bcc.gtk_window), bcc.layout);
    gtk_window_set_decorated(GTK_WINDOW (bcc.gtk_window), FALSE);
    gtk_window_set_default_size (GTK_WINDOW (bcc.gtk_window), workarea.width, workarea.height-200);
    gtk_window_move(GTK_WINDOW (bcc.gtk_window), 0,0);
    gtk_container_set_border_width (GTK_CONTAINER (bcc.gtk_window), 0);
    gtk_layer_set_anchor(bcc.gtk_window, 0, TRUE);// left
    gtk_layer_set_anchor(bcc.gtk_window, 1, TRUE);// right
    gtk_layer_set_anchor(bcc.gtk_window, 2, TRUE);// top
    gtk_layer_set_anchor(bcc.gtk_window, 3, FALSE);// bottom

    // 省略自动补全配置代码...
    
    // 省略信号连接代码...

    // 移除固定宽度设置
    // gtk_entry_set_width_chars(GTK_ENTRY(bcc.entry),170);

    // 将Entry添加到Box,设置填充规则
    gtk_box_pack_start(GTK_BOX(bcc.layout), bcc.entry, TRUE, TRUE, 0);
    // 允许Entry在水平方向扩展
    gtk_widget_set_hexpand(bcc.entry, TRUE);
    // 设置水平对齐方式为填充整个可用空间
    gtk_widget_set_halign(bcc.entry, GTK_ALIGN_FILL);

    bcc_load_styles(&bcc);
    gtk_widget_show_all (GTK_WIDGET (bcc.gtk_window));
}

额外说明

  • 如果需要给Entry添加左右边距,可以在styles.css的entry规则里调整padding-left和padding-right(你已经设置了padding-left:5px,可按需修改),或者在gtk_box_pack_start的最后一个参数设置边距值。
  • 若坚持使用GtkLayout,需要监听窗口的size-allocate信号,手动计算窗口宽度并设置Entry的尺寸,但这种方式繁琐且不符合GTK的布局设计规范,优先推荐使用布局容器方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:02:48