【问题标题】:GTK+/C Avoid preserving space for hidden widgets inside a GtkGridGTK+/C 避免为 GtkGrid 中的隐藏小部件保留空间
【发布时间】:2016-03-07 08:42:14
【问题描述】:

一个 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

给这个窗口:

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

但我想要这个结果:

最简单的方法是什么?

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

【问题讨论】:

    标签: c alignment gtk3


    【解决方案1】:

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

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

    【讨论】:

    • 我想避免交换孩子,因为大网格不是那么高效和简单。我尝试使用GtkFlowBox,但我得到了相同的结果,所以我想我必须编写一个函数来交换它们。我试过的代码在这里:pastebin.com/tsLPdh5h
    猜你喜欢
    • 2010-12-24
    • 2011-02-12
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2011-02-21
    相关资源
    最近更新 更多