6

我在 Gtk+ 教程和参考资料中磕磕绊绊,试图了解如何完成一个体面的布局。文档说您应该使用GtkGrid而不是已弃用的Box/HBox/VBox,但是我无法将其GtkGrid扩展到完整的窗口大小。使用gtk_widget_set_hexpand完全没有影响GtkGrid

这个答案建议 “查看expand属性”,但我找不到有关此属性实际是什么以及如何设置它们的信息(我只是假设每个属性总是有一个 getter/setter 对,但在这种情况下没有gtk_widget_set_expand功能)。

我错过了什么?


更新:

设置扩展属性仍然不起作用 - 按钮“粘”在窗口的左上角。这是代码:

static void initializeGui() {
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Blabla");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 500);
    gtk_window_set_hide_titlebar_when_maximized(GTK_WINDOW(window), TRUE);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    g_signal_connect(window, "delete-event", G_CALLBACK(onWindowDelete), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(onWindowDestroy), NULL);

    GtkWidget *mainbox = gtk_grid_new();
    g_object_set(G_OBJECT(mainbox), "expand", TRUE, NULL);
        GtkWidget *button = gtk_button_new_with_label("Short button");
        g_signal_connect(button, "clicked", G_CALLBACK(onButtonClick), NULL);
        gtk_grid_attach(GTK_GRID(mainbox), button, 0, 0, 1, 1);

        button = gtk_button_new_with_label("Very very long button");
        gtk_grid_attach(GTK_GRID(mainbox), button, 1, 0, 1, 1);

        button = gtk_button_new_with_label("Tiny btn");
        gtk_widget_set_halign(button, GTK_ALIGN_END);
        gtk_grid_attach(GTK_GRID(mainbox), button, 1, 1, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), mainbox);   
    gtk_widget_show_all(window);
}
4

2 回答 2

6

由于您没有包含示例代码,因此很难说出您缺少什么。除了 hexpand 和 vexpand 之外,了解 halign 和 valign 属性可能会有所帮助——尽管您所描述的内容应该仅通过扩展即可实现。

您还应该了解处理此问题的旧方法,即容器“子属性”(参见例如gtk_box_pack_start()以了解它们是如何使用的)。这可能会让人感到困惑,因为有一个expand 子属性hexpand/vexpand 小部件属性......虽然两者都有明确的记录。

文档说你应该使用 GtkGrid 而不是弃用的 Box/HBox/VBox

这不是 GtkBox 的全部内容:它没有被弃用,可以在您需要列或行容器时使用。也就是说,单行/列 GtkGrid 执行完全相同的操作,并且在我看来,它具有更清洁的 api...

我找不到有关此属性实际是什么以及如何设置它们的信息

该文档通常会解释属性是什么:https ://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--expand 。如果没有设置器(或者您想一次设置多个属性),您可以使用g_object_set

g_object_set (widget, "expand", TRUE, NULL);

更新:

从添加的代码看来,GtkGrid 实际上是根据需要扩展的(但这无法通过视觉确认)。另一方面,按钮未设置为展开。如果你这样做,我相信你甚至可以删除 GtkGrids 扩展,因为该属性应该“向上传播”容器链)。

您还没有提到您希望按钮做什么,但您可能想要使用 halign/valign 进行不同的对齐方式(填充/居中/等)。

更新 2:

根据对您真正想要实现的目标的描述,以下更改似乎符合您的要求。左侧的按钮设置为展开并左对齐,其他按钮右对齐:因此所有按钮都紧贴窗口的两侧并具有最小宽度。

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 500);

    GtkWidget *mainbox = gtk_grid_new();

    GtkWidget *button = gtk_button_new_with_label("Short button");
    gtk_widget_set_hexpand (button, TRUE);
    gtk_widget_set_halign (button, GTK_ALIGN_START);
    gtk_grid_attach(GTK_GRID(mainbox), button, 0, 0, 1, 1);

    button = gtk_button_new_with_label("Very very long button");
    gtk_widget_set_halign(button, GTK_ALIGN_END);
    gtk_grid_attach(GTK_GRID(mainbox), button, 1, 0, 1, 1);

    button = gtk_button_new_with_label("Tiny btn");
    gtk_widget_set_halign(button, GTK_ALIGN_END);
    gtk_grid_attach(GTK_GRID(mainbox), button, 1, 1, 1, 1);

    gtk_container_add(GTK_CONTAINER(window), mainbox);
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
于 2013-08-29T20:03:41.050 回答
1

以下代码是显示网格和展开属性的 Vala 代码:

            m_form_detail_grid = new Gtk.Grid();
            m_form_detail_grid.row_spacing = 10;
            m_form_detail_grid.column_spacing = 5;
            // m_form_detail_grid.column_homogeneous = true;
            m_form_detail_grid.expand = true;
            m_form_detail_grid.margin = 30;
            m_form_detail_grid.orientation = Gtk.Orientation.VERTICAL;


            for (int index = 0; index < column_count; index++) {
                column_title = this.m_data_model.get_column_title(index).replace ("_", "__"); 
                column_label = new Gtk.Label(column_title);
                column_label.hexpand = false;
                column_label.halign = Gtk.Align.END;

                column_widget = new Gtk.Entry();
                column_widget.editable = true;
                column_widget.hexpand = true;
                column_widget.halign = Gtk.Align.FILL;

                m_form_detail_grid.attach (column_label, 0, index, 1, 1);
                m_form_detail_grid.attach (column_widget, 1, index, 7, 1);
            }
于 2019-05-10T13:59:06.033 回答