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
给这个窗口:
点击按钮,我得到了这个结果:
但我想要这个结果:
最简单的方法是什么?
P.S。我还需要再次显示隐藏的小部件,它们在发生某些事件时处于相同的位置。想象一下,有另一个按钮,显示widget2和widget3再次获得相同的初始窗口。
答案 0 :(得分:1)
您必须删除widget4并将其重新打包到widget2的空间中。 (您将小部件附加到网格中的特定单元格,因此它们将保留在那里。)
最好使用与GtkGrid
不同的小部件,例如GtkFlowBox
来实现您想要的效果。