了解 Gtk 模板对象

Understanding Gtk template objects

在查看使用 Gtk 和其他库用 C 编写的 gnome-builder 的代码时,我发现了以下代码的快捷方式 window 定义:

ide-快捷方式-window-private.h:

#pragma once
#include <gtk/gtk.h>

G_BEGIN_DECLS

#define IDE_TYPE_SHORTCUTS_WINDOW (ide_shortcuts_window_get_type())

G_DECLARE_FINAL_TYPE (IdeShortcutsWindow, ide_shortcuts_window, IDE, SHORTCUTS_WINDOW, GtkShortcutsWindow)

G_END_DECLS

ide-快捷方式-window.c:

#define G_LOG_DOMAIN "ide-shortcuts-window"
#include "config.h"

#include <glib/gi18n.h>

#include "ide-shortcuts-window-private.h"

struct _IdeShortcutsWindow
{
  GtkShortcutsWindow parent_instance;
};

G_DEFINE_TYPE (IdeShortcutsWindow, ide_shortcuts_window, GTK_TYPE_SHORTCUTS_WINDOW)

static void
ide_shortcuts_window_class_init (IdeShortcutsWindowClass *klass)
{
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);

  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/libide-gui/ui/ide-shortcuts-window.ui");
}

static void
ide_shortcuts_window_init (IdeShortcutsWindow *self)
{
  gtk_widget_init_template (GTK_WIDGET (self));
}

这个 ui 文件描述了 window:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.19 -->
  <template class="IdeShortcutsWindow">
    <property name="modal">true</property>
    <child>
      <object class="GtkShortcutsSection">
        <property name="visible">true</property>
        <property name="section-name">editor</property>
        <property name="title" translatable="yes" context="shortcut window">Editor Shortcuts</property>
        <child>
          <object class="GtkShortcutsGroup">
            <property name="visible">true</property>
            <property name="title" translatable="yes" context="shortcut window">General</property>
            <child>
              <object class="GtkShortcutsShortcut">
                <property name="visible">true</property>
                <property name="title" translatable="yes" context="shortcut window">Show help</property>
                <property name="accelerator">F1</property>
              </object>
            </child>
              ............... 

我以前有过一些 Gtk 应用程序,但我从未见过或使用过这种描述对象的方式,我很难理解这段代码。我知道 .ui 文件描述了一个模板,结构 IdeShortcutsWindow 将从中初始化。但我不知道如何使用它。我应该像这样创建结构的实例吗:

IdeShortcutsWindow shortcuts;

但是我该如何初始化呢?我应该为实例调用 ide-shortcuts-window.c 中定义的函数吗?在查看其余代码时,我没有找到使用 IdeShortcutsWindow 实例的其他地方。

Should I create an instance of the structure like so: IdeShortcutsWindow shortcuts;

使用 g_object_new (IDE_TYPE_SHORTCUTS_WINDOW, NULL) 创建了 class 的新实例。您可以在 gnome-builder code.

中看到相同的内容

有时会提供辅助函数来创建新实例。例如:gtk_button_new ()g_object_new (GTK_TYPE_BUTTON, NULL)the same。这适用于所有 GObject 而非特定于 GtkBuilder 模板。

查看相关文档:1 2

请注意 some_type_new() 是一个只能在 C 中使用的函数。使用 GObject introspection 绑定的语言(例如:Python)只能使用 g_object_new (...) 来创建新对象。

我个人维护了一个模板项目来帮助我轻松开发 GTK 应用程序,可能对您有所帮助:Link