【麒麟在线讲堂】从麒麟天气适配主题颜色视角介绍GSettings配置文件

前言:上期我们介绍了麒麟天气的主要功能,重点说明了其获取网络实时数据的部分。这次,我们以麒麟天气主题适配过程为例,对麒麟天气用到的GSettings配置文件进行介绍。

  安装编程开发依赖包:
$ sudo apt install debhelper (>=9) qtbase5-dev qt5-qmake qtchooser qtscript5-dev qttools5-dev-tools qtbase5-dev-tools libgeoip-dev libx11-dev libGSettings-qt-dev pkgconf
  由于麒麟天气在开发初期使用的是QSS来设置样式,需要使用监听主题GSettings配置文件变化的方式适配主题。

  麒麟天气适配主题时主要有以下两个过程:

  1.监听主题变化

  2.为麒麟天气设置适配主题的样式

1.监听主题变化

    在进行这个过程之前,先对GSettings进行介绍。

  GSettings配置文件可以保存应用程序的配置信息,由schema 文件所声明(schema文档其实是一个规范的xml文档)。但schema文件并不能直接被GSettings使用,需要用glib-compile-schemas编译器将schema文件编译为二进制文件。

  示例:文件的扩展名必须是.gschema.xml

01.png

  QGSettings的具体使用步骤:    

  主题的配置文件由主题创建,而麒麟天气只是监听,所以不需要自己创建GSettings配置文件。下文关于GSettings配置文件的创建部分仅做功能介绍,并没有在适配主题的过程中用到。

创建并引入GSettings配置文件

  首先,依规范,写一个自己的程序的*.gschema.xml文件。


  然后,将写好的*.gschema.xml文件复制到特定文件夹下,再用glib-compile-schemas 将它编译。路径一般为/usr/share/glib-2.0/schemas。

  在具体开发时,在.pro文件中进行路径设置(将配置文件放在特定路径下)
  只有一个*.gschema.xml文件:
schemes.file = data/*.gschema.xml
schemes.path = /usr/share/glib-2.0/schemas/
INSTALLS += schemes
  在debian目录下编译刷新

  在debian目录下创建*.postinst文件,在*.postinst文件中写入以下命令编译刷新系统的GSettings。
glib-compile-schemas /usr/share/glib-2.0/schemas
  另外,还需要在debian目录的control文件中加入GSetting的依赖:
Build-Depends: libGSettings-qt-dev,
pkgconf,

GSettings的几个操作

 (1)使用GSettings的前期配置

  在开始使用GSettings之前,需要进行以下操作:

  *.pro文件中要写入:
CONFIG += link_pkgconfig
PKGCONFIG += GSettings-qt
    在头文件中要写入schema id:    
#define FITTHEMEWINDOW "schema id"
   在mainwindow.h中:
#include <QGSettings>
QGSettings *m_pThemeStyle= nullptr;
 (2)写入和读取

  读取主题设置:get:获取schema中指定的key值。
nowThemeStyle = m_pThemeStyle->get("key name").toString();
   对配置文件的写入:set:设置schema中指定的key值。
m_pThemeStyle->set("key name", str);

(当然,外部不能随意更改主题配置文件,只是作为写入的用法演示,str为你想写入的内容,要遵循该GSettings创建者制定的规范。)

 (3)监听系统主题变化,切换麒麟天气配置状态

   监听事件改变主要就是监听key值的改变。在主题的配置文件中,当名为key name的key的值变化时,就意味着当前主题发生改变。这时我们只要判断当前是什么主题,来对应的切换麒麟天气的风格即可。

   GSettings提供了changed信号来发送key改变的事件。
//监听key的value是否发生了变化
   connect(m_pThemeStyle, &QGSettings::changed, this, [=] (const QString &key)
   {
   if (key == "key name")
   {
   qDebug() << "执行对应的功能";
   }
   });

2.麒麟天气主题适配样式

   在监听到系统主题变化后,根据设计来修改麒麟天气的背景颜色等,这里不再详细介绍。

默认或浅色主题

深色主题或夜间模式