在Windows 7中的gtk + 3.0中。
我正在创建一个按钮并将它们打包到水平框中。我已将展开设置为FALSE。现在按钮不是在x方向上扩展而是在垂直方向上扩展。我也不希望按钮也垂直扩展。
int main(int argc, char* argv[]) {
gtk_init(&argc, &argv);
GtkWidget* window = NULL;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Layout using BOX");
//gtk_widget_set_size_request(window, 50, 300);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget* button[5] = {NULL};
for(int i = 0; i < 5; ++i) {
std::stringstream buton_label;
buton_label << "Button ";
buton_label << (i + 1);
button[i] = gtk_button_new_with_label(buton_label.str().c_str());
gtk_widget_set_hexpand(button[i], FALSE);
g_signal_connect(button[i], "clicked", G_CALLBACK(button_clicked_cb), (gpointer)window);
}
GtkWidget *hbox = NULL;
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
//hbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
for(int i = 0; i < 5; ++i) {
gtk_box_pack_start(GTK_BOX(hbox), button[i], FALSE, TRUE, 10);
}
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
答案 0 :(得分:1)
在GTK 3中,小部件告诉容器它想要如何扩展(与GTK 2相反)。因此,您需要使用小部件的hexpand
和vexpand
属性进行水平和垂直展开,并使用gtk_widget_set_hexpand
等函数。与halign
和valign
对齐相同。
修改强>:
作为规则的例外,请阅读gtk_box_pack_start及其fill
参数的文档:
填
如果扩展选项给予孩子的空间是实际的,则为TRUE 分配给孩子,而不仅仅是填充它。这个参数有 如果expand设置为FALSE则无效。 孩子总是被分配 水平GtkBox的全高和垂直的全宽 GtkBox 即可。此选项会影响其他维度。
因此,如果您想控制其他维度,请将水平框放在垂直框内,在调用expand
时将FALSE
设置为gtk_box_pack_start
。
#include <gtk/gtk.h>
#include <sstream>
int main(int argc, char* argv[]) {
gtk_init(&argc, &argv);
GtkWidget* window = NULL;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Layout using BOX");
//gtk_widget_set_size_request(window, 50, 300);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget* button[5] = {NULL};
for(int i = 0; i < 5; ++i) {
std::stringstream buton_label;
buton_label << "Button ";
buton_label << (i + 1);
button[i] = gtk_button_new_with_label(buton_label.str().c_str());
gtk_widget_set_hexpand(button[i], FALSE);
// g_signal_connect(button[i], "clicked", G_CALLBACK(button_clicked_cb), (gpointer)window);
}
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
for(int i = 0; i < 5; ++i) {
gtk_box_pack_start(GTK_BOX(hbox), button[i], FALSE, FALSE, 10);
}
gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
使用框的Intead(可能有点难以使用,因为你必须弄清楚事物的扩展方式),尝试使用功能更强大的GtkGrid
。它与chidren的hexpand / vexpand属性一样,如上所述。