如何让GTK滚动窗口内的极小GRID随主窗口正常扩展?
问题原因说明
首先明确gtk_scrolled_window_new()的两个参数不需要修改:
- 第一个参数是水平滚动的
GtkAdjustment对象,第二个是垂直滚动的GtkAdjustment对象 - 传入
NULL会让GTK自动创建默认的滚动调整对象,完全适配常规滚动窗口使用场景,无需改动
你遇到的网格无法正常扩展的问题,核心是三个配置缺失:
- 滚动窗口未设置扩展属性,无法自动填充满主窗口的可用空间
- 主窗口未设置初始默认尺寸,启动时会直接收缩到子控件的最小请求大小
- 所有Entry控件未设置水平扩展属性,无法填满网格单元格的宽度
修改方案
只需要在原有代码基础上补充3处配置即可:
- 给主窗口设置初始默认尺寸
- 给滚动窗口开启水平、垂直扩展属性
- 给每个Entry控件开启水平扩展属性
修改后完整代码
#include <gtk/gtk.h> int main(int argc, char **argv){ gtk_init(&argc, &argv); GtkWidget *mainwindow; mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(mainwindow), "Example"); // 新增:设置主窗口初始默认尺寸 gtk_window_set_default_size(GTK_WINDOW(mainwindow), 600, 400); g_signal_connect(mainwindow, "destroy", G_CALLBACK(gtk_main_quit), NULL); int n = 5; GtkWidget *entries[n][n]; GtkWidget *grid; GtkWidget *scrolledwindow; grid = gtk_grid_new(); gtk_grid_set_row_spacing(GTK_GRID(grid), 5); gtk_grid_set_column_spacing(GTK_GRID(grid), 3); scrolledwindow = gtk_scrolled_window_new(NULL, NULL); // 新增:让滚动窗口自动扩展填充满父容器的可用空间 gtk_widget_set_hexpand(scrolledwindow, TRUE); gtk_widget_set_vexpand(scrolledwindow, TRUE); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ entries[i][j] = gtk_entry_new(); // 新增:让输入框自动扩展填满网格单元格 gtk_widget_set_hexpand(entries[i][j], TRUE); gtk_grid_attach(GTK_GRID(grid), entries[i][j], i, j, 1, 1); } } gtk_container_add(GTK_CONTAINER(scrolledwindow), grid); gtk_container_add(GTK_CONTAINER(mainwindow), scrolledwindow); gtk_widget_show_all(mainwindow); gtk_main(); return 0; }
效果对比
- 实际运行效果(原代码):

- 期望效果:

内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

