填充窗口

在这节中,我们用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