我正在绊倒Gtk +教程和参考,试图了解如何完成一个体面的布局。文档说你应该使用GtkGrid
而不是弃用的 Box / HBox / VBox ,但我无法让GtkGrid
扩展到完整的窗口大小。使用gtk_widget_set_hexpand
对GtkGrid
完全没有影响。
This answer suggests“查看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);
}
答案 0 :(得分:5)
由于您没有包含示例代码,因此很难说您缺少了什么。除了hexpand和vexpand之外,了解halign和valign属性可能会有所帮助 - 尽管你所描述的内容应该仅适用于扩展。
您还应该了解处理此容器和儿童属性的旧方法" (参见例如gtk_box_pack_start()
以了解它们是如何使用的)。这可能会让人感到困惑,因为expand child property和hexpand/vexpand widget properties ......两者都有明确的记录。
文档说你应该使用GtkGrid而不是弃用的 盒/ HBox中/垂直框
这不是关于GtkBox的全部内容:它不被弃用,可以在需要列或行容器时使用。也就是说,单行/列GtkGrid完全相同,在我看来,它有一个更干净的API ...
我无法找到有关此属性实际是什么以及如何设置它们的信息
文档通常会解释属性是什么:https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--expand。如果没有setter(或者您想一次设置多个属性),则可以使用g_object_set
:
g_object_set (widget, "expand", TRUE, NULL);
<强>更新强>
从添加的代码中看起来GtkGrid实际上是按照您的需要进行扩展(但这在视觉上无法确认)。另一方面,按钮未设置为展开。如果你这样做,我相信你甚至可以删除GtkGrids扩展,因为该属性应该&#34;传播&#34;集装箱链)。
您还没有提到按钮要执行的操作,但您可能需要使用halign / valign进行不同的对齐(填充/中心/等)。如果你需要更高的对齐精度,你应该看看在容器和按钮之间放置一个GtkAlignment:这会让你说像#34;使用60%的可用空间用于小部件,将它从左边缘放置20%& #34;
更新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;
}
答案 1 :(得分: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);
}