gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:43:51 26 4
gpt4 key购买 nike

我在 Gtk+ 教程和引用资料中跌跌撞撞,试图了解如何完成一个体面的布局。文档说你应该使用 GtkGrid而不是已弃用的 Box/HBox/VBox,但我无法获得 GtkGrid扩展到整个窗口大小。使用 gtk_widget_set_hexpandGtkGrid 没有影响根本。

This answer suggests “查看 expand 属性”但我找不到有关 的信息什么 这个属性实际上是和 怎么样你设置它们(我只是假设每个属性总是有一个 getter/setter 对,但在这种情况下没有 gtk_widget_set_expand 函数)。

我错过了什么?

更新:

设置 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);
}

最佳答案

由于您没有包含示例代码,因此很难说您缺少什么。除了 hexpand 和 vexpand 之外,了解 halign 和 valign 属性可能会有所帮助——尽管您所描述的应该只用扩展就可以实现。
您还应该了解处理此问题的旧方法,即容器“子属性”(参见例如 gtk_box_pack_start() 以了解它们是如何/如何使用的)。这可能会让人感到困惑,因为有一个 expand child propertyhexpand/vexpand widget properties ... 两者都有明确记录。

The docs say you should use GtkGrid instead of the deprecatedBox/HBox/VBox


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

I can't find information about what this properties actually are and how you set them


文档通常解释了这些属性是什么: https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--expand .如果没有 setter(或者你想一次设置多个属性)你可以使用 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;
}

关于properties - 如何理解 Gtk+ 属性并使 GtkGrid 扩展到可用区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com