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
给这个窗口:
点击按钮,我得到这个结果:
,但我想这样的结果:
什么是最简单的方法是什么?
p.s.我还需要在发生某些事件时在相同的位置再次显示隐藏的小部件。想象一下再有一个按钮显示widget2和widget3再次获得相同的初始窗口。
我想避免交换孩子,因为用大网格不太高效和简单。我尝试过使用'GtkFlowBox',但我得到了相同的结果,所以我想我必须编写一个函数来交换它们。我试过的代码在这里:http://pastebin.com/tsLPdh5h – RobotMan