带有XML接口的基本UI Gtk

时间:2016-12-19 09:13:16

标签: c xml gtk

我正在测试一些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文件位于同一文件夹中。这是测试决定,没有其他含义。

2 个答案:

答案 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);
相关问题