了解 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
模板。
请注意 some_type_new()
是一个只能在 C 中使用的函数。使用 GObject introspection 绑定的语言(例如:Python)只能使用 g_object_new (...)
来创建新对象。
我个人维护了一个模板项目来帮助我轻松开发 GTK 应用程序,可能对您有所帮助:Link
在查看使用 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
模板。
请注意 some_type_new()
是一个只能在 C 中使用的函数。使用 GObject introspection 绑定的语言(例如:Python)只能使用 g_object_new (...)
来创建新对象。
我个人维护了一个模板项目来帮助我轻松开发 GTK 应用程序,可能对您有所帮助:Link