如何理解Gtk +属性并使GtkGrid扩展到可用区域?

Ask*_*aga 4 gtk properties packing

我正在绊倒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);
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*nen 5

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

您还应该了解处理此容器"子属性"的旧方法(例如gtk_box_pack_start(),查看它们是如何使用的).这可能会让人感到困惑,因为有一个扩展子属性hexpand/vexpand小部件属性 ......但两者都有明确的记录.

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

这不是关于GtkBox的全部故事:它不被弃用,可以在需要列或行容器时使用.也就是说,单行/列GtkGrid完全相同,并且在我看来,它具有更清洁的API ...

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

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

g_object_set (widget, "expand", TRUE, NULL);
Run Code Online (Sandbox Code Playgroud)

更新:

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

你没有提到你想要按钮做什么,但你可能想要使用halign/valign进行不同的对齐(填充/中心/等).如果你需要更高的对齐精度,你应该看看在容器和按钮之间放置一个GtkAlignment:这会让你说"为小部件使用60%的可用空间,从左边缘放置20%".

更新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;
}
Run Code Online (Sandbox Code Playgroud)