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
相关产品推荐
相关产品推荐

