UI xml文件中的Gtk HeaderBar ActionBar pack_start pack_end

Asy*_*abs 4 glade vala genie gtk3 gnome-3

我们正在尝试使用Gnome-Builder/Meson/Glade/Flatpak开发应用程序用户界面Gtk3/Vala/Genie.虽然有许多例子 Gtk.HeaderBar.pack_start( ... ),并Gtk.ActionBar.pack_start( ... )在瓦拉和其他基于GTK文档中,我们一直没能找到一个XML文件的用户界面中使用的例子.

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

提供以下琐碎的XML文件MainApplication.ui,例如,如何将一个pack_startpack_endGtkColorButtonGtkHeaderBar

<?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>
Run Code Online (Sandbox Code Playgroud)

这在源文件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 )
Run Code Online (Sandbox Code Playgroud)

Asy*_*abs 6

好.仅仅为了完成目的,在使用Glade之后我已经为ui xml文件生成了这个结构,该文件说明了如何在HeaderBar中打包.我根本找不到任何这样的例子,也无法在ui文件中找到任何包含此内容的源代码 - 大量以编程方式执行 - 但到目前为止还没有将其显示为xml.当<packing></packing>指示position(从零开始)的标记作为子元素的一部分被包含时,就会发生魔术,即:

<packing>
  <property name="position">2</property>
</packing> 
Run Code Online (Sandbox Code Playgroud)

并且似乎不需要为第一个零索引子项包含打包标记.

对于最终包装,通过使用pack_type属性进行魔术:

<packing>
  <property name="pack_type">end</property>
  <property name="position">1</property>
</packing>
Run Code Online (Sandbox Code Playgroud)

因此,对于程序的等价的XML pack_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>
Run Code Online (Sandbox Code Playgroud)


Jos*_*nte 3

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

你不知道。这些方法用于以编程方式将子窗口小部件添加到容器窗口小部件。使用glade 来做到这一点可以避免使用代码来做到这一点。

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

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

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

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

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

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

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

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

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

  1. Gtk.HeaderBar pack_startpack_end
  2. Gtk.Container方法(add、add_with_properties...)

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

  1. header_bar.pack_start (new Gtk.ColorButton ());
  2. header_bar.add (new Gtk.ColorButton ());

  • @AsymLabs 是的,Vala 和 Genie 没有看到太多“爱”,特别是 Genie。关于问题本身。是的,确实,您将在程序中使用或引用的名称和标记为 GtkChilds。其他的都是多余的。它们在那里,但不需要使用,大部分是容器。检查 github 上的一堆 GNOME 应用程序,我想 Genie 中没有一个,但 Vala 中有一些。祝你好运。顺便说一句,如果它回答了您的问题,请随意接受答案。 (2认同)