停止hbox中的按钮以垂直扩展

时间:2014-01-15 07:13:36

标签: gtk gtk3

在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;
}

1 个答案:

答案 0 :(得分:1)

在GTK 3中,小部件告诉容器它想要如何扩展(与GTK 2相反)。因此,您需要使用小部件的hexpandvexpand属性进行水平和垂直展开,并使用gtk_widget_set_hexpand等函数。与halignvalign对齐相同。

修改

作为规则的例外,请阅读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属性一样,如上所述。