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

Properties 如何理解Gtk+;属性并使GtkGrid扩展到可用区域?,properties,gtk,packing,Properties,Gtk,Packing,我正在结结巴巴地阅读Gtk+教程和参考资料,试图了解如何完成一个像样的布局。文档说你应该使用GtkGrid而不是不推荐使用的Box/HBox/VBox,但是我很难将GtkGrid扩展到完整的窗口大小。使用gtk\u widget\u set\u hexpand对GtkGrid没有任何影响 “查看expand属性”,但我找不到有关这个属性实际上是什么以及如何设置它们的信息(我只是假设每个属性都有一个getter/setter对,但在这种情况下没有gtk_widget_set_expand函数) 我

我正在结结巴巴地阅读Gtk+教程和参考资料,试图了解如何完成一个像样的布局。文档说你应该使用
GtkGrid
而不是不推荐使用的Box/HBox/VBox,但是我很难将
GtkGrid
扩展到完整的窗口大小。使用
gtk\u widget\u set\u hexpand
GtkGrid
没有任何影响

“查看
expand
属性”,但我找不到有关这个属性实际上是什么以及如何设置它们的信息(我只是假设每个属性都有一个getter/setter对,但在这种情况下没有
gtk_widget_set_expand
函数)

我错过了什么


更新:

            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);
            }
设置expand属性仍然不起作用-按钮“粘住”在窗口的左上角。代码如下:


由于没有包含示例代码,很难说您缺少了什么。除了hexpand和vexpand之外,了解halign和valign属性也会很有帮助——尽管您所描述的应该只需要扩展就可以实现

您还应该了解处理此问题的旧方法,即容器“子属性”(请参阅例如
gtk_box\u pack_start()
了解它们的使用方式)。这可能会让人困惑,因为有一个。。。不过,这两种情况都有明确的记录

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

这并不是GtkBox的全部内容:它没有被弃用,可以在需要列或行容器时使用。也就是说,一个单行/列GtkGrid做了完全相同的事情,在我看来,它有一个更干净的api

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

文档通常解释属性是什么:。如果没有setter(或您希望同时设置多个属性),则可以使用:

更新:

            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);
            }
从添加的代码来看,GtkGrid实际上是按照您的需要进行扩展的(但这不可能直观地确认)。另一方面,按钮未设置为展开。如果您这样做,我相信您甚至可以删除GtkGrids(扩展,因为属性应该“向上传播”容器链)

您还没有提到希望按钮执行的操作,但是您可能希望对不同的对齐方式(填充/居中/等)使用halign/valign

更新2:

            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);
            }
根据对您真正想要实现的目标的描述,下面的更改似乎满足了您的要求。左侧的按钮设置为展开并向左对齐,其他按钮则向右对齐:因此,所有按钮都紧靠窗口的侧面并具有最小宽度

#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;
}
#包括
int main(int argc,char*argv[])
{
gtk_init(&argc,&argv);
GtkWidget*window=gtk_window_new(gtk_window_TOPLEVEL);
gtk_窗口设置默认大小(gtk_窗口(窗口),800500);
GtkWidget*mainbox=gtk_grid_new();
GtkWidget*button=gtk_按钮_新_带_标签(“短按钮”);
gtk_widget_set_hexpand(按钮,TRUE);
gtk_小部件设置(按钮,gtk_对齐_开始);
gtk_网格连接(gtk_网格(主框),按钮,0,0,1,1);
按钮=gtk_按钮_新按钮_标签(“非常长按钮”);
gtk_小部件_设置_halign(按钮,gtk_对齐_端);
gtk_网格连接(gtk_网格(主框),按钮,1,0,1,1);
按钮=gtk_按钮_新_,带有_标签(“微小btn”);
gtk_小部件_设置_halign(按钮,gtk_对齐_端);
gtk_网格连接(gtk_网格(主框),按钮,1,1,1,1);
gtk_容器添加(gtk_容器(窗口),主框);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

follow code是显示网格和展开属性的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);
            }
m_form_detail_grid=new Gtk.grid();
m_形式_细节_网格。行间距=10;
m_形式_详图_网格。柱间距=5;
//m_form_detail_grid.column_均质=真;
m_form_detail_grid.expand=true;
m_形式_细节_网格边距=30;
m_form_detail_grid.orientation=Gtk.orientation.VERTICAL;
对于(int index=0;index<列计数;index++){
column\u title=this.m\u data\u model.get\u column\u title(index.replace(“\uu”);
列标签=新的Gtk.标签(列标题);
列_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(列标签,0,索引,1,1);
m_form_detail_grid.attach(column_widget,1,index,7,1);
}

虽然GtkBox尚未被弃用,但文档中指出,您不应将其用于“未来证明”代码。我没有意识到属性是GObject的一部分,而不是Gtk-我感到羞耻:)出于某种原因,它仍然不能与expand属性集一起工作。我添加了代码也许你可以看一下?你有一个未来的证据。我已经更新了答案,希望你了解其中的诀窍——GTK盒子模型有点古怪(传统的cruft没有帮助),但当你“理解”它时,它非常强大。是的,如果你展开按钮,更改将传播到容器中。然而,我对一个解决方案感兴趣,其中第0列中的按钮接触左侧窗口,第1列中的按钮接触右侧窗口,所有按钮仅占用所需空间,仅此而已。正如您所见,我已经在代码中尝试了按钮的halign属性,不幸的是没有达到预期效果。因此,我尝试了您的代码,就我所知,hexpand+halign似乎与您描述的完全一样