2016-03-05 56 views
1

GtkGrid包含一些小部件。当我隐藏一些这些小部件时,仍然存在它们的空间,而我想让所有可见小部件以“自然方式”重新对齐(不保留隐藏小部件的空间)。GTK +/C避免保留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

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

使用与GtkGrid不同的小部件(如GtkFlowBox)可以实现您想要的效果。

+0

我想避免交换孩子,因为用大网格不太高效和简单。我尝试过使用'GtkFlowBox',但我得到了相同的结果,所以我想我必须编写一个函数来交换它们。我试过的代码在这里:http://pastebin.com/tsLPdh5h – RobotMan