具有 XML 接口的基本 UI Gtk

Basic UI Gtk with XML interfaces

我正在测试一些 GTK+ 示例。

在某些给定函数中,对 XML 文件某些路径的引用出现在 C代码。它解释了 C 中的代码正在读取 XML 内容以 稍后将其编译为可从 C 代码使用:

static void
example_app_window_class_init (ExampleAppWindowClass *class)
{
  gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
                                               "/org/gtk/exampleapp/window.ui");
}

我能理解这里发生的事情,但在这种情况下,如何读取源代码XML? window.ui。因为回购没有文件夹 正如他们提到的 (/org/gtk/exampleapp/).

所以,在我的函数中,我希望做如下事情:

static void my_style_window_class_init(MyStyleWindowClass *class) {
  gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS(class),
                                              "window.ui");
}

我所有的 XML 内容都在与 *.c*.h 文件相同的文件夹中。这是一个 testing 的决定,没有其他意义。

函数名的_from_resource()部分表示路径/org/gtk/exampleapp/window.ui不是文件系统路径,而是资源路径。资源路径与称为 GResource 的 GLib 功能相关联,它允许您将二进制数据嵌入到程序或共享库中。

您将编写一个 XML 文件来描述哪些本地文件映射到哪些资源路径,然后作为构建过程的一部分,您将使用 [=12= 将其转换为 C 源文件] 工具。然后将该 C 源文件构建到您的程序中。完整的详细信息在我在第一段中链接的页面上。

(请注意,这些与 Windows 可执行文件中的嵌入式资源不同,后者使用完全不同的技术,但工作方式相似。)

如果您想从文件中加载某些内容,GLib 和 GTK+ 以及其他基于它们构建的库提供 _from_file()_from_data()_from_stream() 替代 _from_resource() 功能。 _from_file() 直接从文件中读取数据。 _from_data() 从内存中读取。 _from_stream() 从 GStream 读取,GStream 是一个面向对象的 I/O 端点,由 GLib 在其 GIO 模块中定义。函数名后缀是可选的;它会有所不同。

gtk_widget_class_set_template_from_resource() 的情况下,提供的等效项是 gtk_widget_class_set_template(), which follows the _from_data() pattern of reading from memory. The memory is stored in a GBytes 对象,因此您必须从本地文件读取到 GBytes。

这是一个老歌,问题似乎得到了解答,但我想采取直接的方法并提出解决方案 - 事实证明我们可以用这条线代替

gtk_widget_class_set_template_from_resource (widget_class,
                         "/org/gnome/gtksourceview/tests/ui/test-widget.ui");

用这一行使代码工作。

if (g_file_get_contents("test-widget.ui", &contents, &len, &err) == FALSE)
    g_error("error reading test-widget.ui: %s", err->message);
bytes = g_bytes_new_take(contents, len);
gtk_widget_class_set_template(GTK_WIDGET_CLASS(klass), bytes);