我正在测试一些 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
,在这种情况下。因为 repo 没有文件夹
正如他们提到的那样 (/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
文件相同的文件夹中。这是一个测试的决定,没有其他意义。
最佳答案
_from_resource()
部分函数名表示路径/org/gtk/exampleapp/window.ui
不是文件系统路径,而是资源路径。资源路径与称为 GResource 的 GLib 功能相关联它允许您将二进制数据嵌入到程序或共享库中。
您可以编写一个 XML 文件来描述哪些本地文件映射到哪些资源路径,然后作为构建过程的一部分,您可以将其转换为带有 glib-compile-resources
的 C 源文件。工具。然后将该 C 源文件构建到您的程序中。完整的详细信息在我在第一段中链接的页面上。
(请注意,这些与 Windows 可执行文件中的嵌入式资源不同,后者使用完全不同的技术,但工作方式相似。)
如果你想从一个文件中加载一些东西,GLib 和 GTK+ 以及其他建立在它们之上的库提供了一个 _from_file()
, _from_data()
, 或 _from_stream()
_from_resource()
的替代品功能。 _from_file()
直接从文件中读取数据。 _from_data()
从内存中读取。 _from_stream()
从 GStream 读取,它是 GLib 在其 GIO 模块中定义的面向对象的 I/O 端点。函数名后缀是可选的;它会有所不同。
在gtk_widget_class_set_template_from_resource()
的情况下, 提供的等价物是 gtk_widget_class_set_template()
, 它遵循 _from_data()
从内存中读取的模式。内存存储在 GBytes 中对象,因此您必须从本地文件读取到 GBytes。
关于c - 带有 XML 接口(interface)的基本 UI Gtk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219172/