• PyQt学习笔记-使用QSettings保存系统配置参数


    1.QSettings简介

    QSettings继承于QObject,位于PyQt6.QtCore模块中,是PyQt中用来存储配置信息的常用工具。

    QSettings的API基于QVariant,允许您以最小的工作量保存大多数基于值的类型,例如QString,QRect和QImage。

    可通过配置将应用程序需要保存的参数数据保存到本地,如windows的注册表,macOS 和 iOS 上的属性列表文件,linux的ini文本文件等。

    2.初始化QSettings及数据存储位置

    2.1 使用系统api存储

    通过指定公司、软件信息初始化QSettings会将参数存储到系统默认的地方中,初始化方法如下:

        @typing.overload
        def __init__(self, organization: str, application: str = ..., parent: typing.Optional[QObject] = ...) -> None: ...
        @typing.overload
        def __init__(self, scope: 'QSettings.Scope', organization: str, application: str = ..., parent: typing.Optional[QObject] = ...) -> None: ...
        @typing.overload
        def __init__(self, format: 'QSettings.Format', scope: 'QSettings.Scope', organization: str, application: str = ..., parent: typing.Optional[QObject] = ...) -> None: ...
        @typing.overload
        def __init__(self, fileName: str, format: 'QSettings.Format', parent: typing.Optional[QObject] = ...) -> None: ...
        @typing.overload
        def __init__(self, scope: 'QSettings.Scope', parent: typing.Optional[QObject] = ...) -> None: ...
        @typing.overload
        def __init__(self, parent: typing.Optional[QObject] = ...) -> None: ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    不同的初始化有不同的配置信息存储位置,可供搜索的存储位置如下,软件会按顺序搜索:

    1. 应用程序的用户特定位置;
    2. 所属组织所有应用程序的用户特定位置;
    3. app的系统范围位置;
    4. 所属组织的的系统范围位置

    假设组织为“MyORG”,应用程序名为“MyApp”:

    构造函数应用程序的用户特定位置所属组织所有应用程序的用户特定位置app的系统范围位置所属组织的的系统范围位置
    QSettings(“MyORG”,“MyApp”)
    QSettings(“MyORG”)x
    QSettings(QSettings.Scope.SystemScope, “MyORG”, “MyApp”)xx
    QSettings(QSettings.Scope.SystemScope, “MyORG”)xxx

    一般自动所有第一个找到的文件位置,其他位置的文件用作数据回退使用。根据系统不一样会存储到对用的注册表和配置文件夹路径。

    2.2 存储成配置文件

    2.2.1 使用文件格式设置

    通过指定文件路径以及设置文件格式,可以将配置信息存储到成配置文件,并且存储到指定目录下。

    QSettings("config.ini", QSettings.Format.IniFormat)
    
    • 1

    此处传入两个参数,一个是文件路径,第二个是文件格式。
    如果ini文件不存在时系统会自动创建该文件。

    2.2.2 Format格式说明

    QSettings.Format格式

    格式UnixWindows
    NativeFormat.conf 文件系统注册表
    IniFormat.ini 文件.ini 文件

    注:

    • 保存成ini文件的数值,读回时将会会以QString格式返回,需要自行转换类型。
    • 默认格式为NativeFormat。

    3 Qsettings的使用

    3.1 QSettings的数据保存和读取

    3.1.1 使用setValue方法保存数据

    qsettings.setValue("name", self.txt_name.text())
    
    • 1

    传入两个参数,第一个参数为键值,第二个参数为要保存的值。
    当键值存在时会替换该数值,键值不存在时会创建相依的值。

    3.1.2 使用value方法获取配置文件种的数据

    qsettings.value("name")
    
    • 1

    使用键值直接获取对应的数据,获取到的数据可再根据自己需要进行类型转换。

    3.2 节点和键值语法

    QSettings中存储数据可以使用“/”作为分组依据,键值中包含“\”和“/”字符最终都会前置转换为“/”。
    而由于部分系统键值不区分大小写(如Windows),而部分系统键值区分大小写(如mac),故设置键值时尽量使用统一的键值,而且避免存在仅大小写不一致的键值。
    使用“/”进行分组,即“/”前的是组别,之后的是名称,用于区分不同的单元和分组保存数据,实际使用,存在多分组的时候可以使用beginGroup()即endGroup()类做同组数据保存;

    	# App.config是一个QSettings类,我封装在App类中作为全局属性,方便调用	
        App.config.beginGroup("mainwindow")
        App.config.setValue("name", self.txt_name.text())
        print(self.mainview.txt_name.text())
        App.config.setValue("password", self.txt_password.text())
        print(self.mainview.txt_password.text())
        App.config.sync() # 直接保存,若不调用则一段时间后自动保存。
        App.config.endGroup()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果如下:

    111
    这是密码
    111
    这是密码
    # 添加分组后,键值会自动带上组别,并且以“/”划分
    ['mainwindow/name', 'mainwindow/password', 'name', 'password', 'size']
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    若多次使用分组管理,则会自行添加多个分组。

    	# 多次使用分组管理
        App.config.beginGroup("mainwindow")
        App.config.beginGroup("login")
        App.config.setValue("name", self.txt_name.text())
        App.config.setValue("password", self.txt_password.text())
        App.config.sync() # 直接保存,若不调用则一段时间后自动保存。
        App.config.endGroup()
        App.config.endGroup()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果:

    ['mainwindow/login/name', 'mainwindow/login/password', 'mainwindow/name', 'mainwindow/password', 'name', 'password', 'size']
    
    • 1

    3.3 常用方法介绍

    3.3.1 使用allkeys()方法返回所有的键值

    App.config.allKeys()
    
    • 1
    ['mainwindow/login/name', 'mainwindow/login/password', 'mainwindow/name', 'mainwindow/password', 'name', 'password', 'size']
    
    • 1

    3.3.2 使用childGroups方法返回子级分组

    App.config.childGroups()
    
    • 1
    childGroups :
    ['mainwindow']
    
    • 1
    • 2

    3.3.3 使用childKeys方法返回子级键列表

    App.config.childKeys()
    
    • 1
    childKeys :
    ['name', 'password', 'size']
    
    • 1
    • 2

    3.3.4 使用clear方法清楚所有数据

       App.config.clear()
       print("clear : ")
       print(App.config.allKeys())
    
    • 1
    • 2
    • 3
    clear :
    []
    
    • 1
    • 2

    此操作会删除数据,建议谨慎操作,一般使用remove方法代替,用于移除指定的分组或键值数据。

    3.3.5 使用remove移除数据

    remove(Union[QByteArray, str])
    
    • 1
            App.config.remove("mainwindow")
            print("allKeys : ")
            print(App.config.allKeys())
    
    • 1
    • 2
    • 3
    allKeys :
    ['name', 'password']
    
    • 1
    • 2

    注:

    • 要移除分组时需要先行调用beginGroup()方法。
    • 若键值参数设置为“”(空字符串),将会把所有的键值 全部清空

    3.3.6 使用contains方法识别是否包含键值或者组

    contains(Union[QByteArray, str])bool
    
    • 1

    键值查询时直接查询,若要查询分组,需要先行调用beginGroup()函数,然后在进行查询。

    3.3.6 使用status查询状态

    status() → Status
    
    • 1
    状态说明
    AccessError1访问错误(如尝试写入只读文件)
    FormatError2格式错误(如加载错误的ini文件)
    NoError0未发生错误
  • 相关阅读:
    Stable Diffusion WebUI扩展sd-webui-controlnet之Canny
    设计模式学习(十八):迭代器模式
    Day-05 CentOS7.5 安装 Docker
    分布式锁实现对比
    基于SSM的智慧作业试题管理系统(有报告)。Javaee项目。
    [云原生k8s] k8s资源限制以及探针检查
    原来还能这样看Java线程的状态及转换
    Spark MLlib案例:采用线性回归模型预测房价
    C#WPF动态资源和静态资源应用实例
    (218)Verilog HDL:实现简单 FSM2(异步复位)
  • 原文地址:https://blog.csdn.net/u010839204/article/details/132906802