如何控制GtkWidget中前导空格的数量?

时间:2012-10-09 13:33:32

标签: c gtk gtk3

如何在GtkWidget中设置前导空格?正如您可以在下面的imagem中看到的那样,当窗口开始时,用户名/密码小部件与水平线相差一点

enter image description here

我的代码:

  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();

2 个答案:

答案 0 :(得分:3)

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

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

更新:根据你的评论,也许你应该尝试使用GtkGrid而不是盒子,使用网格更容易排列。

答案 1 :(得分:2)

GtkGrid内的GtkDialog可能更适合您要实现的布局,但是,让我至少帮助您完成现在的代码。

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

首先,您可以控制GtkLabel内文本的“对齐”。由于GtkLabelGtkMisc,您可以使用它来对齐文本。对齐是一个分数,其中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 +教程中的How Packing Effects the Layout。通过在Glade中使用打包属性,您可以在使用C对其进行硬编码之前快速测试布局。

另请注意,从GTK + 3开始,"halign""valign""hexpand""vexpand"现在优先于"expand"和{{1} } properties。

修改

这是一种“更好”的方法,使用"fill"来处理GTK + 3的高度宽度几何,并确保您拥有行和列。

首先,设置条目窗口小部件的GtkGrid属性(而不是将它们“打包”到带有展开的框中):

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); 的参数指定每个小部件的位置,宽度和高度(单元格,而不是像素)。有关详细信息,请查看API docs for GtkGrid