我使用 Quickly 创建了一个 Ubuntu 应用程序,我可以在项目根目录的 data/glib-2.0 文件夹中看到一个 XML 文件,但我不太清楚它是用来做什么的。XML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<schemalist gettext-domain="sample-application">
<schema id="net.launchpad.sample-application" path="/net/launchpad/sample-application/">
<key name="example" type="s">
<default>''</default>
<summary>Sample setting</summary>
<description>Longer description of this sample setting. Talk about allowed values and what it does.</description>
</key>
</schema>
</schemalist>
此外,在使用新应用程序创建的默认首选项对话框代码中,我可以看到以下代码:
settings = Gio.Settings("net.launchpad.sample-application")
widget = self.builder.get_object('example_entry')
settings.bind("example", widget, "text", Gio.SettingsBindFlags.DEFAULT)
我不知道这是做什么。
答案1
XML 文件定义了一组键,您可以在整个应用程序中使用这些键来存储用户偏好设置。
在元素架构中,您将注意到两个属性:id 和 path。id 是您在实例化设置对象时在代码中引用架构时使用的。path 是存储键的位置。
dconf-tools
您可以通过安装包并运行来找到设置dconf-editor
。然后导航到上面定义的节点。问题 (/net/launchpad/sample-application) 中的 XML 中的节点将在此处:
该模式用于 GSettings API。您可以在此处查看基于 GTK C 的文档:http://developer.gnome.org/gio/stable/GSettings.html。这是Gio模块
至于代码。
settings = Gio.Settings("net.launchpad.sample-application")
这将创建 GSettings 对象,您可以使用该对象绑定小部件以存储设置。该参数需要与 XML 中的 schema 元素的 id 属性完全匹配。
settings.bind("example", widget, "text", Gio.SettingsBindFlags.DEFAULT)
example
这将在架构中的键与text
的属性之间创建绑定widget
。传递给键的值是指定小部件的文本属性。对于 GtkEntry,文本是最明显的属性。因为它被绑定了,所以每当您在首选项窗口中更改属性的值时,它都会自动更新。最后一个参数决定绑定的工作方向 - 请参阅文档了解更多信息。
您在 XML 中为键指定的类型应该与以下之一匹配可用选项。通常是一个字符,您将在定义的常量中看到它。例如对于布尔值:
#定义 G_VARIANT_TYPE_BOOLEAN ((const GVariantType *)“b”)
所以布尔值等于b
。
因此,假设您想要一个布尔键,您可以在架构元素下方与其他键一起添加以下内容:
<key name="complete" type="b">
<default>false</default>
<summary>Whether the task is complete</summary>
<description>This key is used to determine if a particular part of the application is complete or not</description>
</key>
然后像这样绑定活动属性:
# Get the widget (named chk_complete)
complete = self.ui.chk_complete
# Bind the property
settings.bind("complete", complete, "active", Gio.SettingsBindFlags.DEFAULT)
然后就可以使用 get 函数访问特定于数据类型的设置。例如
settings = Gio.Settings("net.launchpad.sample-application")
example = settings.get_string("example")
complete = settings.get_boolean("complete")