2016-12-19 46 views
1

我正在测试一些GTK +示例。带有XML接口的基本UI 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文件。这是一个测试的决定,没有其他含义。

回答

4

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

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

(请注意,这些都是不一样的Windows可执行文件中嵌入资源,这完全使用不同的技术,但在类似的方式工作。)

如果你想从一个文件,油嘴加载的东西, GTK +和其他构建于其上的库提供了替代_from_resource()函数的_from_file()_from_data()_from_stream()_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。

+0

非常感谢。 – Hell0

+0

所以它的一种'虚拟路径'只能在'resource'中使用_scope_¿正确吗?文档说使用'Java-style-path'来避免冲突。什么样的冲突?我认为这与当地的_HD_道路有关,但我认为我并不完全理解。 – Hell0

+1

是的,它是一个虚拟路径,具有全新的命名空间。之所以说避免冲突是因为如果你有一个名为'/ myresource.xml'的资源,并且你的一个共享库也试图拥有一个名为'/ myresource.xml'的资源,那么会有冲突。 – andlabs