2

如何在 GtkWidget 中设置前导空格?正如您在下面的图像中看到的那样,当窗口开始时,用户名/密码小部件离水平线有点远

在此处输入图像描述

我的代码:

  GtkWidget *window;
  GtkWidget *login_label;
  GtkWidget *username_label, *password_label;
  GtkWidget *username_entry, *password_entry;
  GtkWidget *ok_button;
  GtkWidget *hbox0, *hbox1, *hbox2, *hbox3;
  GtkWidget *vbox;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "hello");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 300);

  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  login_label    = gtk_label_new("Login");
  username_label = gtk_label_new("Username: ");
  password_label = gtk_label_new("Password: ");
  username_entry = gtk_entry_new();
  password_entry = gtk_entry_new();

  gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
  ok_button = gtk_button_new_with_label("Enter");

  g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(print_username), ok_button);

  hbox0 = gtk_hbox_new(TRUE, 5);
  hbox1 = gtk_hbox_new(TRUE, 5);
  hbox2 = gtk_hbox_new(TRUE, 5);
  hbox3 = gtk_hbox_new(TRUE, 5);

  vbox =  gtk_vbox_new(FALSE, 10);

  gtk_box_pack_start(GTK_BOX(hbox0), login_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox3), ok_button, FALSE, FALSE, 5);

  gtk_box_pack_start(GTK_BOX(vbox), hbox0, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 5);

  gtk_container_add(GTK_CONTAINER(window), vbox);

  gtk_widget_show_all(window);
  gtk_main();
4

2 回答 2

3

这取决于您用来保存这些小部件的容器类型。

假设它是最外层的GtkVBox,行具有单个小部件或多个 GtkBox,您应该查看 的参数gtk_box_pack_start(),尤其是fill标志。

更新:根据您的评论,也许您应该尝试使用 aGtkGrid而不是框,使用网格更容易使事物整齐排列。

于 2012-10-09T13:36:33.930 回答
2

a 的GtkGrid内部GtkDialog可能更适合您尝试实现的布局,但是,至少让我帮助您的代码,就像现在一样。

对于包装,我假设您希望GtkLabel小部件具有固定宽度,左对齐。小GtkEntry部件将填满其余的水平空间。

首先,您可以控制GtkLabel. 由于 aGtkLabel是 a GtkMisc,您可以使用它来对齐文本。对齐是0.0一直到左/上和1.0一直到右/下的分数。

username_label = gtk_label_new("Username: ");
password_label = gtk_label_new("Password: ");

/* left align horizontally, center align vertically */
gtk_misc_set_alignment(GTK_MISC(username_label), 0.0, 0.5);
gtk_misc_set_alignment(GTK_MISC(password_label), 0.0, 0.5);

假设您使用的是 GTK+ 3,您可能应该放弃不推荐使用的gtk_hbox_new()功能gtk_vbox_new(),转而使用gtk_box_new(). 我发现在 GTK+ 3 中使用那些不推荐使用的函数经常会出现意想不到的结果。

hbox0 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
vbox =  gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);

最后,您可以更改包装,以便标签不会扩展,但条目会扩展。

/* login label fills all horiz space */
gtk_box_pack_start(GTK_BOX(hbox0), login_label, TRUE, TRUE, 5);

/* labels do NOT expand, but they will fill the space if it's there */
gtk_box_pack_start(GTK_BOX(hbox1), username_label, FALSE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_label, FALSE, TRUE, 5);

/* entries expand and fill all remaining space */
gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, TRUE, 5);

虽然它有点过时了,但您可能想阅读我的 GTK+ 教程中的包装如何影响布局。通过在Glade中使用打包属性,您可以在用 C 进行硬编码之前快速测试您的布局。

另请注意,从 GTK+ 3 开始,"halign","valign""hexpand"现在"vexpand"优先于"expand"and"fill"属性。

编辑

这是一种“更好”的方法,它可以更好地GtkGrid处理 GTK+ 3 的宽度与高度几何形状,并确保您同时拥有行和列。

首先,设置hexpand入口小部件的属性(而不是将它们“打包”到一个带有扩展的盒子中):

/* allow entry widgets to expand */
gtk_widget_set_hexpand(username_entry, TRUE);
gtk_widget_set_hexpand(password_entry, TRUE);

接下来,将所有小部件附加到网格。您可以跨多个列跨越“登录”标签和“确定”按钮:

grid = gtk_grid_new();

/* 5 pixels between rows and columns */
gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);

/* 5 pixels around entire grid */
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);

/* "login" spans 2 columns */
gtk_grid_attach(GTK_GRID(grid), login_label, 0, 0, 2, 1);

gtk_grid_attach(GTK_GRID(grid), username_label, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), username_entry, 1, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), password_label, 0, 2, 1, 1);
gtk_grid_attach(GTK_GRID(grid), password_entry, 1, 2, 1, 1);

/* "ok" button spans 2 columns */
gtk_grid_attach(GTK_GRID(grid), ok_button, 0, 3, 2, 1);

gtk_container_add(GTK_CONTAINER(window), grid);

用于gtk_grid_attach指定每个小部件的位置、宽度和高度(以单元格,而不是像素为单位)的参数。查看GtkGrid 的 API 文档了解详细信息。

于 2012-10-11T22:06:41.883 回答