GTK + / C避免为GtkGrid中隐藏的小部件保留空间

时间:2016-03-05 16:47:16

标签: c alignment gtk3

GtkGrid包含一些小部件。当我隐藏其中一些小部件时,仍然有他们的空间,而我希望所有可见的小部件都以自然的方式重新排列" (不保留隐藏小部件的空间)。

一个小例子:

#include <gtk/gtk.h>

GtkWidget *label2, *label3;

static gboolean on_button_click (GtkButton *button, gpointer data) {
    gtk_widget_hide (label2);
    gtk_widget_hide (label3);
    return TRUE;
}

int main (int argc, char **argv) {
    gtk_init(&argc, &argv);
    GtkWidget *window;
    GtkWidget *label1 = gtk_label_new("Widget1");
    label2 = gtk_label_new("Widget2");
    label3 = gtk_label_new("Widget3");
    GtkWidget *label4 = gtk_label_new("Widget4");
    GtkWidget *button = gtk_button_new_with_label ("Hide widget2 and widget3");
    g_signal_connect(button, "clicked", G_CALLBACK (on_button_click), NULL);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);

    GtkGrid *grid = (GtkGrid*)gtk_grid_new ();
    gtk_grid_set_row_spacing((GtkGrid*)grid, 50);
    gtk_grid_set_column_spacing((GtkGrid*)grid, 50);
    // 2 columns
    gtk_grid_insert_column (grid, 0);
    gtk_grid_insert_column (grid, 1);
    // 2 rows
    gtk_grid_insert_row (grid, 0);
    gtk_grid_insert_row (grid, 1);

    //Add widgets to the grid
    gtk_grid_attach(GTK_GRID(grid), label1, 1, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), label2, 2, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), label3, 1, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), label4, 2, 1, 1, 1);

    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
    gtk_box_pack_start (GTK_BOX (box), (GtkWidget*)grid, FALSE, FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), box);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}

这个程序编译:

gcc `pkg-config --cflags gtk+-3.0` test.c `pkg-config --libs gtk+-3.0` -o test

给这个窗口:

enter image description here

点击按钮,我得到了这个结果:

enter image description here

但我想要这个结果:

enter image description here

最简单的方法是什么?

P.S。我还需要再次显示隐藏的小部件,它们在发生某些事件时处于相同的位置。想象一下,有另一个按钮,显示widget2和widget3再次获得相同的初始窗口。

1 个答案:

答案 0 :(得分:1)

您必须删除widget4并将其重新打包到widget2的空间中。 (您将小部件附加到网格中的特定单元格,因此它们将保留在那里。)

最好使用与GtkGrid不同的小部件,例如GtkFlowBox来实现您想要的效果。