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

GTK4 C开发如何实现GtkGrid网格内控件居中显示

GtkGrid内按钮居中失效原因
  • GtkGrid作为窗口直接子控件时,默认对齐属性为GTK_ALIGN_FILL,会自动撑满整个窗口的可用区域
  • GtkGrid仅会为放置了有效控件、或配置了伸缩属性的行列分配尺寸,你代码里将按钮挂载到列5、行3的位置,但前0-4列、0-2行既无控件也未配置伸缩权重,默认宽高为0,完全不会预留空白,因此按钮组会直接贴在窗口左上角
  • 单独给按钮设置set_hexpand类接口仅能控制按钮是否抢占自身所在单元格的多余空间,无法让无内容的空行列自动分配空间,自然达不到居中效果。

原代码运行效果如下:
运行效果截图

方案1:Grid整体居中(实现最简单,适合固定控件组居中场景)

直接修改GtkGrid自身的对齐属性,让Grid不再撑满窗口,仅包裹按钮组的实际尺寸,自动在窗口内水平、垂直居中,代码改动量最小:

GtkWidget *p_main_grid = gtk_grid_new();

gtk_grid_set_column_spacing(GTK_GRID(p_main_grid), 16);
gtk_grid_set_row_spacing(GTK_GRID(p_main_grid), 16);

// 新增两行配置:让Grid在父容器(窗口)中居中,不撑满整个窗口
gtk_widget_set_halign(p_main_grid, GTK_ALIGN_CENTER);
gtk_widget_set_valign(p_main_grid, GTK_ALIGN_CENTER);

/* Buttons */
GtkWidget *p_button_1 = gtk_button_new_with_label("Button 1");
GtkWidget *p_button_2 = gtk_button_new_with_label("Button 2");

/* Add Buttons to grid */
// 不需要再写5、3这类大行列坐标,从0,0开始挂载即可
gtk_grid_attach(GTK_GRID(p_main_grid), p_button_1, 0, 0, 1, 1);
gtk_grid_attach_next_to(GTK_GRID(p_main_grid), p_button_2, p_button_1,
                        GTK_POS_RIGHT, 1, 1);

/* Add grid to main window */
gtk_window_set_child(GTK_WINDOW(p_main_window), p_main_grid);
gtk_window_present(GTK_WINDOW(p_main_window));

该方案下窗口缩放时,按钮组会始终保持在窗口正中间,按钮本身不会被拉伸变形。

方案2:Grid撑满窗口,按钮在网格内部居中(适合网格需占满窗口的场景)

如果你需要GtkGrid铺满整个窗口,仅让按钮组在网格区域内居中,可以给按钮外侧的空行列配置伸缩属性,让空行列平分窗口的多余空间,把按钮挤到网格中间:

GtkWidget *p_main_grid = gtk_grid_new();

gtk_grid_set_column_spacing(GTK_GRID(p_main_grid), 16);
gtk_grid_set_row_spacing(GTK_GRID(p_main_grid), 16);

/* Buttons */
GtkWidget *p_button_1 = gtk_button_new_with_label("Button 1");
GtkWidget *p_button_2 = gtk_button_new_with_label("Button 2");

/* Add Buttons to grid 按钮放在网格中间行列位置*/
gtk_grid_attach(GTK_GRID(p_main_grid), p_button_1, 1, 1, 1, 1);
gtk_grid_attach_next_to(GTK_GRID(p_main_grid), p_button_2, p_button_1,
                        GTK_POS_RIGHT, 1, 1);

// 配置列:左右两侧插入空列,设置所有列等宽平分水平空间
gtk_grid_insert_column(GTK_GRID(p_main_grid), 0);
gtk_grid_insert_column(GTK_GRID(p_main_grid), 3);
gtk_grid_set_column_homogeneous(GTK_GRID(p_main_grid), TRUE);

// 配置行:上下两侧插入空行,设置所有行等高平分垂直空间
gtk_grid_insert_row(GTK_GRID(p_main_grid), 0);
gtk_grid_insert_row(GTK_GRID(p_main_grid), 3);
gtk_grid_set_row_homogeneous(GTK_GRID(p_main_grid), TRUE);

/* Add grid to main window */
gtk_window_set_child(GTK_WINDOW(p_main_window), p_main_grid);
gtk_window_present(GTK_WINDOW(p_main_window));

如果不需要所有行列等宽/等高,也可以单独给外侧空行列调用gtk_grid_set_column_expand()、gtk_grid_set_row_expand()开启伸缩属性,不需要开启homogeneous配置。注意不要给按钮本身设置hexpand/vexpand,否则按钮会被拉伸填满所在单元格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:12:23