在查看gnome-builder的代码时,它是用C语言使用Gtk和其他库编写的,我发现了以下用于定义快捷窗口的代码:
ide-shortcuts-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-shortcuts-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文件描述了这个窗口:
<?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-shortcut -window.c中定义的函数吗?在查看其余代码时,我没有找到使用IdeShortcutsWindow
实例的其他地方。
我应该像这样创建一个结构的实例吗?
IdeShortcutsWindow shortcuts;
用g_object_new (IDE_TYPE_SHORTCUTS_WINDOW, NULL)
创建一个新的类实例。你可以在gnome-builder代码中看到相同的内容。
有时提供帮助函数来创建新实例。例如:gtk_button_new ()
和g_object_new (GTK_TYPE_BUTTON, NULL)
是相同的。这适用于所有GObject
模板,而不是特定于GtkBuilder
模板。
参见相关文档:1 2
请注意,some_type_new()
是一个只能在c中使用的函数。使用GObject自省绑定的语言(例如:Python)只能使用g_object_new (...)
来创建新对象。
我个人维护一个模板项目来帮助我轻松开发GTK应用程序,可能对你有帮助:链接