• 填充窗口

    填充窗口

    在这节中,我们用GtkBuilder 模板结合一个GtkBuilder ui 文件和我们的应用程序窗口类。

    我们简单的ui 文件把GtkHeaderBar 放在GtkStack 部件顶端。头栏包括一个显示GtkStack 页面分页的一行的独立部件——GtkStackSwitcher。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <interface>
    3. <!-- interface-requires gtk+ 3.8 -->
    4. <template class="ExampleAppWindow" parent="GtkApplicationWindow">
    5. <property name="title" translatable="yes">Example Application</property>
    6. <property name="default-width">600</property>
    7. <property name="default-height">400</property>
    8. <child>
    9. <object class="GtkBox" id="content_box">
    10. <property name="visible">True</property>
    11. <property name="orientation">vertical</property>
    12. <child>
    13. <object class="GtkHeaderBar" id="header">
    14. <property name="visible">True</property>
    15. <child type="title">
    16. <object class="GtkStackSwitcher" id="tabs">
    17. <property name="visible">True</property>
    18. <property name="margin">6</property>
    19. <property name="stack">stack</property>
    20. </object>
    21. </child>
    22. </object>
    23. </child>
    24. <child>
    25. <object class="GtkStack" id="stack">
    26. <property name="visible">True</property>
    27. </object>
    28. </child>
    29. </object>
    30. </child>
    31. </template>
    32. </interface>

    为了在我们的应用程序中使用这个文件,我们回到我们的GtkApplicationWindow 子类,从类初始化函数中调用gtk_widget_class_set_template_from_resource() 来把ui 文件设为这个类的模板。在实例初始化函数中我们增加gtk_widget_init_template() 去为我们的类的个体实例化模板。

    1. ...
    2. static void
    3. example_app_window_init (ExampleAppWindow *win)
    4. {
    5. gtk_widget_init_template (GTK_WIDGET (win));
    6. }
    7. static void
    8. example_app_window_class_init (ExampleAppWindowClass *class)
    9. {
    10. gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
    11. "/org/gtk/exampleapp/window.ui");
    12. }
    13. ...

    (full source)

    你也许注意到了,我们在函数中用了变量_from_resource()来设定一个模板。现在我们需要用GLib的资源功能在二进制文件中包含一个ui file。通常是在.gresource.xml中列出所有资源,就像这样:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <gresources>
    3. <gresource prefix="/org/gtk/exampleapp">
    4. <file preprocess="xml-stripblanks">window.ui</file>
    5. </gresource>
    6. </gresources>

    这个文件必须被转换成一个C 源文件,这样它才能和其他源文件一起被编译链接进应用程序中。因此,我们使用了glib-complie-resources

    1. glib-compile-resources exampleapp.gresource.xml --target=resources.c --generate-source

    如今我们的应用程序就像这样:

    getting-started-app2.png