我正在测试一些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
文件位于同一文件夹中。这是测试决定,没有其他含义。
答案 0 :(得分:4)
函数名称的_from_resource()
部分表示路径/org/gtk/exampleapp/window.ui
不是文件系统路径,而是资源路径。资源路径与GLib的一个名为GResource的功能相结合,允许您在程序或共享库中嵌入二进制数据。
您可以编写一个XML文件来描述哪些本地文件映射到哪些资源路径,然后作为构建过程的一部分,您可以使用glib-compile-resources
工具将其转换为C源文件。然后,将该C源文件构建到您的程序中。完整的详细信息在我在第一段中链接的页面上。
(请注意,这些与Windows可执行文件中的嵌入式资源不同,后者使用不同的技术,但以类似的方式工作。)
如果您想从文件加载某些内容,GLib和GTK +以及在其上构建的其他库提供_from_file()
,_from_data()
或_from_stream()
替代_from_resource()
功能。 _from_file()
直接从文件中读取数据。 _from_data()
从内存中读取。 _from_stream()
从GStream读取,GStream是GLib在其GIO模块中定义的面向对象的I / O端点。函数名称后缀是可选的;它各不相同。
对于gtk_widget_class_set_template_from_resource()
,提供的等效值为gtk_widget_class_set_template()
,它遵循从内存中读取的_from_data()
模式。内存存储在GBytes对象中,因此您必须从本地文件读取GBytes。
答案 1 :(得分:0)
这是个老歌,问题似乎已经解决,但我想直接采取一种方法并提出解决方案-事实证明,我们可以用这行代替
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);