如何让GTK3中Entry组件宽度适配窗口宽度?
让GTK3 Entry组件宽度适配窗口宽度的方法
你当前使用的GtkLayout是绝对布局容器,它只会按照指定位置和固定尺寸放置子组件,无法自动随窗口大小调整。要实现Entry宽度适配窗口,需要换成支持自动布局的容器,并配置Entry的扩展属性,具体步骤如下:
修改步骤
- 替换容器类型:将
GtkLayout替换为水平方向的GtkBox,GtkBox会自动根据窗口尺寸分配子组件的可用空间。 - 配置Entry扩展属性:让Entry在水平方向填充所有可用空间。
- 移除固定宽度限制:删除
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
相关产品推荐
相关产品推荐

