5

我们正在试用 Gtk3/Vala/Genie 来使用 Gnome-Builder/Meson/Glade/Flatpak 开发应用程序用户界面。Gtk.HeaderBar.pack_start( ... )虽然在 Vala和其他 Gtk 文档中有很多示例 Gtk.ActionBar.pack_start( ... ),但我们无法在 xml ui 文件中找到使用示例。

所以问题是:如何将 pack_start/pack_end 与 ui xml 文件一起使用?是否有任何生成的 xml ui 文件的示例或如何在 Glade 中生成?这会作为 HeaderBar/ActionBar 的属性/属性/子项输入吗?这会是什么样子 - 一般结构是什么?如果它不是 a GtkChild,那么如何在 Vala/Genie 源文件中访问它?

提供以下琐碎的 xml 文件MainApplication.ui,例如,如何将 onepack_startpack_endaGtkColorButton提供给GtkHeaderBar?

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.2 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <template class="MainWindow" parent="GtkApplicationWindow">
    <property name="can_focus">False</property>
    <property name="default_width">1024</property>
    <property name="default_height">768</property>
    <child type="titlebar">
      <object class="GtkHeaderBar" id="header_bar">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="title">Test Application</property>
        <property name="subtitle">gnome.org</property>
        <property name="show_close_button">True</property>
      </object>
    </child>
    <child>
      <object class="GtkBox" id="content_box">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <placeholder/>
        </child>
        <child>
          <object class="GtkActionBar" id="action_bar">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </template>
</interface>

这在源文件中使用MainApplication.gs如下:

[GtkTemplate (ui = "/org/gnome/application/ui/MainApplication.ui")]
class MainWindow : Gtk.ApplicationWindow

    [GtkChild]
    header_bar:Gtk.HeaderBar

    [GtkChild]
    action_bar:Gtk.ActionBar

    construct ( application:Gtk.Application )

        GLib.Object( application: application )

class MainApplication:Gtk.Application

    construct( id:string, flags:GLib.ApplicationFlags )

        /* set locale: ALL, "" */
        Intl.setlocale()

        /* set properties */
        set_application_id( id )
        set_flags( flags )
4

3 回答 3

7

好的。只是为了完成的目的,在玩过 Glade 之后,我为 ui xml 文件生成了这个结构,该文件说明了打包如何在 HeaderBar 中工作。我根本找不到这方面的任何例子,也找不到任何包含在 ui 文件中的源 - 大量以编程方式完成 - 但到目前为止还没有将其显示为 xml。<packing></packing>当指示(从零开始)的标记position作为子元素的一部分包含在内时,就会发生魔术,即:

<packing>
  <property name="position">2</property>
</packing> 

似乎没有必要为第一个零索引子项包含包装标签。

对于端包装,魔术是通过使用一个pack_type属性来实现的:

<packing>
  <property name="pack_type">end</property>
  <property name="position">1</property>
</packing>

因此,程序化的等效 xmlpack_startpack_endpack_type属性。

在完整的上下文中,以下说明了在包含 GtkHeaderBar 的标题栏中的使用:

<child type="titlebar">
  <object class="GtkHeaderBar" id="header_bar">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="title">Test Application</property>
    <property name="subtitle">gnome.org</property>
    <property name="show_close_button">True</property>
    <child>
      <object class="GtkButton">
        <property name="label">gtk-justify-fill</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="use_stock">True</property>
        <property name="always_show_image">True</property>
      </object>
    </child>
    <child>
      <object class="GtkButton">
        <property name="label">gtk-edit</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="use_stock">True</property>
        <property name="always_show_image">True</property>
      </object>
      <packing>
        <property name="position">1</property>
      </packing>
    </child>
    <child>
      <object class="GtkButton">
        <property name="label">gtk-find</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="use_stock">True</property>
      </object>
      <packing>
        <property name="position">2</property>
      </packing>
    </child>
  </object>
</child>
于 2018-02-02T19:44:36.867 回答
3

如何将 pack_start/pack_end 与 ui xml 文件一起使用?

你没有。这些方法用于以编程方式将子小部件添加到容器小部件。使用 glade 这样做可以避免使用代码来执行此操作。

是否有任何生成的 xml ui 文件的示例或如何在 Glade 中生成?

不确定我是否理解这里的问题。Glade 生成 xml ui 定义文件。将它们与 GtkBuilder 一起使用将实例化小部件,然后您可以使用 Gtk.Builderget_object方法检索这些小部件。您正在使用另一个选项,称为 Gtk Composite Templates。这允许您在 glade 内创建复合小部件并将小部件映射到您的代码类/类属性/字段,这将加速编码过程。你可以在这里阅读更多

这会作为 HeaderBar/ActionBar 的属性/属性/子项输入吗?

它足够灵活,可以将带有标题栏的 Window 类作为属性/字段,并且标题栏中的小部件也将是窗口的属性或单独的关注点,并将标题栏作为复合小部件,然后将标题栏添加到窗户。对于最后一个选项,您需要以编程方式将标题栏设置为窗口,除非您准备好处理 glade 小部件目录,从而允许您在 glade 的左侧小部件调色板中拥有自己的标题栏复合小部件。

这会是什么样子 - 一般结构是什么?如果它不是 GtkChild,那么如何在 Vala/Genie 源文件中访问它?

如果它不是一个孩子,我们会假设它不在 glade 定义中或不在任何地方,因此它必须以编程方式实例化并使用 Gtk.Containeradd方法或特定容器添加方法(如pack_start/end等)添加到容器中。

提供以下简单的 xml 文件 MainApplication.ui,例如,如何将一个 pack_start 和 pack_end 一个 GtkColorButton 传递给 GtkHeaderBar?

您可以添加一个 GtkColorButton 与 glade,命名它,将其设置为 GtkChild 并检索它。这将是您的复合小部件的一个字段(假设您的代码和模板的使用)。

如果没有,那么您将创建一个新的 Gtk.ColorButton 实例,并以编程方式将其添加到 Gtk.HeaderBar。由于 Gtk.HeaderBar 是一个容器(继承自 Gtk.Container 抽象类),因此您有一些方法可以向其中添加子项:

  1. Gtk.HeaderBar pack_startpack_end
  2. Gtk.Container方法(添加,add_with_properties...)

例如,在 Vala 中,Gtk.ColorButton使用 1 和 2 添加一个:

  1. header_bar.pack_start (new Gtk.ColorButton ());
  2. header_bar.add (new Gtk.ColorButton ());
于 2018-02-02T11:39:36.063 回答
1

通过使用“位置”选项卡,在 Glade 中也是完全可行的。

请参阅附图并注意我将第三个按钮放置在标题栏的右端。选择按钮,单击位置选项卡并选择“结束”作为位置。

显示位置选项卡的 Glade 屏幕截图

Glade 预览还会渲染最后打包的第三个按钮,就像在代码中调用 pack_end() 一样。

Glade 预览截图

于 2020-12-26T17:53:13.943 回答