Qt配置文件之QGSettings

本文介绍使用dconf作为后端的GSetting用法,dconf是一个简单的底层配置存储管理系统,可以使用图形化的dconf-editor根据path来检索GSettings并管理key,而且支持在key发生改变时发出通知(changed信号)。命令行工具gsettings提供了对GSetings的命令行操作,可以查询、读取和设置键值。如果你觉得glib、gio太复杂(查看GSettings的API文档可以使用工具devhelp),那么使用Qt的QGSettings来操作gsetting将会让你备很轻松,而且代码的可读性将提升,本文提供的demo就是使用QGSettings来操作gsetting。


示例源码

示例代码简要展示了如何使用QGSettings进行配置文件的读和写,以及监控配置文件中key的变化,并将其他途径导致的key的变化的value更新到代码中。

开发库的安装

$ sudo apt install qtbase5-dev qt5-qmake qtchooser qtscript5-dev qttools5-dev-tools qtbase5-dev-tools libgsettings-qt-dev

示例源码的编译和运行

注意:在Qt的工程文件.pro中,需要加入如下两行:

1
2
CONFIG += link_pkgconfig
PKGCONFIG += gsettings-qt

1
2
3
4
5
$ sudo install -m 0644 qgsettings-demo.gschema.xml /usr/share/glib-2.0/schemas
$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas
$ qmake
$ make
$ ./qsettings-demo

配置文件

GSettings的配置文件是xml格式的,文件需以.gschema.xml结尾,一个配置文件里面可以包含多个schema,每个schema可由多个key组成(key是无法通过代码动态创建的)。详细说明如下:
字段 说明
id schema中的id在整个配置系统中是唯一的,否则在执行glib-compile-schemas时会忽略重复的id的开头通常使用与应用相关的域名。
path schema中的path必须是以/开头并且以/结尾,不能包含连续的/,path用于指定在storage中存储路径,可以与id不一致。
name key的名称,需要在此schema中唯一,name的值由小写字母、数字和-组成,并且开头必须是小写字母,不能以-结尾,也不能出现连续的-。
type key的类型,需要是GVariant支持的类型,除了可以使用基本的类型外,也可按照GVariant的方式组合类型。
default key的默认值
summary key的简单描述
description key的详细描述

在schema文件中,通常一个id对应一个固定的path,但也可不设置path,这样就是一个可重定位的schema,path两头必须都有/,否则会验证失败。但是需要注意如果没有指定path属性,则gsettings无法被dconf-editor读取。要想schema文件被GSettings使用,还需要借助编译器glib-compile-schemas将schema文件编译为二进制文件。GSettings读取XDG_DATA_DIRS下的glib-2.0/schemas路径,需要将schema文件放到环境变量XDG_DATA_DIRS/glib-2.0/schemas/路径下,一般为/usr/share/glib-2.0/schemas和/usr/local/share/glib-2.0/schemas。这里我们将qgsettings-demo.gschema.xml文件拷贝到/usr/share/glib-2.0/schemas路径下,然后执行如下一条命令将其编译刷新系统的gsettings中,否则使用的时候将报错并导致程序退出(Settings schema ‘apps.eightplus.qgsettings-demo’ is not installed):

1
$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas

gsettings命令

命令 说明
gsettings list-schemas 显示系统已安装的不可重定位的schema(已安装并已安装并有固定path的 schema)。
gsettings list-relocatable-schemas 显示已安装的可重定位的schema(已安装却没有固定path的 schema)。
gsettings list-children SCHEMA 显示指定schema的children,其中SCHEMA为xml文件中schema的id属性值,如示例代码中daemon的”apps.eightplus.qgsettings-demo”。
gsettings list-keys SCHEMA 显示指定schema的所有项(key)。
gsettings range SCHEMA KEY 查询指定schema的指定项KEY的有效取值范围。
gsettings get SCHEMA KEY 显示指定schema的指定项KEY的值。
gsettings set SCHEMA KEY VALUE 设置指定schema的指定项KEY的值为VALUE。
gsettings reset SCHEMA KEY 恢复指定schema的指定项KEY的值为默认值。
gsettings reset-recursively SCHEMA 恢复指定schema的所有key的值为默认值。
gsettings list-recursively [SCHEMA] 如果有SCHEMA参数,则递归显示指定schema的所有项(key)和值(value),如果没有SCHEMA参数,则递归显示所有schema的所有项(key)和值(value)。
  • 举例

    • 查看apps.eightplus.qgsettings-demo是否已经安装

      1
      2
      lixiang@lixiang-TM1701:~$ gsettings list-schemas |grep apps.eightplus.qgsettings-demo
      apps.eightplus.qgsettings-demo
    • 查看apps.eightplus.qgsettings-demo的schema下所有项的取值

      1
      2
      3
      4
      lixiang@lixiang-TM1701:~$ gsettings list-recursively  apps.eightplus.qgsettings-demo
      apps.eightplus.qgsettings-demo male false
      apps.eightplus.qgsettings-demo age 22
      apps.eightplus.qgsettings-demo name 'lixiang'
    • 获取name的值

      1
      gsettings get apps.eightplus.qgsettings-demo name
    • 设置name的值

      1
      gsettings set apps.eightplus.qgsettings-demo name kobe
    • 恢复name的默认值

      1
      gsettings reset apps.eightplus.qgsettings-demo name
    • 恢复所有key的默认值

      1
      gsettings reset-recursively apps.eightplus.qgsettings-demo

参考文档

https://developer.gnome.org/GSettings/

李翔 wechat
微信交流
谢谢支持
0%