如何在GtkWidget中设置前导空格?正如您可以在下面的imagem中看到的那样,当窗口开始时,用户名/密码小部件与水平线相差一点
我的代码:
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();
答案 0 :(得分:3)
这取决于您用来容纳这些小部件的容器类型。
假设它是最外层的GtkVBox,使用单个小部件或更多行的GtkBox,您应该查看gtk_box_pack_start()
的参数,尤其是fill
标志。
更新:根据你的评论,也许你应该尝试使用GtkGrid
而不是盒子,使用网格更容易排列。
答案 1 :(得分:2)
GtkGrid
内的GtkDialog
可能更适合您要实现的布局,但是,让我至少帮助您完成现在的代码。
对于打包,我假设您希望GtkLabel
小部件是固定宽度,左对齐。 GtkEntry
小部件将填满水平空间的其余部分。
首先,您可以控制GtkLabel
内文本的“对齐”。由于GtkLabel
是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 +教程中的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。