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

2023-09-21 16:46:31

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. 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)

此处传入两个参数,一个是文件路径,第二个是文件格式。
如果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())

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

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

qsettings.value("name")

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

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()

结果如下:

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

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

	# 多次使用分组管理
    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()

结果:

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

3.3 常用方法介绍

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

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

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

App.config.childGroups()
childGroups :
['mainwindow']

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

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

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

   App.config.clear()
   print("clear : ")
   print(App.config.allKeys())
clear :
[]

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

3.3.5 使用remove移除数据

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

注:

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

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

contains(Union[QByteArray, str])bool

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

3.3.6 使用status查询状态

status() → Status
状态说明
AccessError1访问错误(如尝试写入只读文件)
FormatError2格式错误(如加载错误的ini文件)
NoError0未发生错误
更多推荐

基于SpringBoot的民宿管理平台系统的设计与实现

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻不然下次找不到哟Sp

VR虚拟仿真在旅游课堂教学演示

首先,VR虚拟仿真能够为学生提供逼真的旅游体验。传统的旅游课堂教学主要以图片、文字和视频为主要教学工具,这无法给学生带来身临其境的感觉。而VR技术能够通过360度全景视角、立体声音和触觉反馈等功能,将学生置身于虚拟的旅游场景中。无论是登上古老的埃及金字塔,在巴黎卢浮宫欣赏名画,还是漫步在纽约时代广场的繁华街头,学生可以

Mysql高级——索引优化和查询优化(2)

5.排序优化5.1排序优化问题:在WHERE条件字段上加索引,但是为什么在ORDERBY字段上还要加索引呢?优化建议:SQL中,可以在WHERE子句和ORDERBY子句中使用索引,目的是在WHERE子句中避免全表扫描,在ORDERBY子句避免使用FileSort排序。当然,某些情况下全表扫描,或者FileSort排序不

关于安卓SVGA浅尝(二)加载数据

关于安卓SVGA浅尝(二)加载数据相关链接SVGA官网SVGA-github说明文档背景项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中用到了svga的动画,因此,就有了这一系列的文章。实现对于svga的加载方法,有以下几种:(1)decode

VR全景智慧文旅解决方案,助力文旅产业转型升级

引言:随着科技的不断发展,虚拟现实(VR)技术正逐渐展露其影响力,改变着旅游业。VR全景智慧文旅解决方案也应运而生,将传统旅游的体验形式从线下扩展到了线上,带来了不一般的文旅体验。一.VR全景技术的基础VR全景技术是通过结合虚拟现实和全景摄影技术来模拟现实世界的方法。通过智能设备,游客可以在任何时间,任何地点进入逼真的

5个超实用的Python代码片段

迷途小书童读完需要7分钟速读仅需3分钟本篇收集了5个常用的Python代码片段,非常实用,可以帮助我们更高效的编写代码,实现我们想要实现的功能。1密码生成器importrandomimportstringtotal=string.ascii_letters+string.digits+string.punctuatio

内网横向移动

内网横向移动当攻击者在拿下一台内网主机后,通常会利用当前拿下的机器当作跳板,进一步攻击内网其他主机,扩大攻击影响范围。攻击机:KaliLinux靶机:Windowsserver2008WEB10.10.10.20\192.168.XX.XX(跳板机)Windowsserver2012DC10.10.10.10\192.

RS485总线浪涌解决方案!|深圳比创达EMC

在各种通讯方式当中,RS485总线是较为常见的一种,因其接口简单、系统运行稳定和通讯速率高等特点被广泛应用。但由于RS485总线一般传输距离较长,且经常暴露在外,所以非常容易受到电磁干扰,而浪涌干扰已经成为485通信使用中最常遇到的问题。下面通过一个实际案例,来说明RS485总线在防浪涌实验过程中,常遇到的问题以及需要

shell中[[]]与[],=、==和-eq的辨析

1、==、=和-eq在shell中,=和==运算符都可以用于判断两个字符串、两个字符串变量是否相同,==支持模式匹配,而=不支持模式匹配。使用-eq来判断两个整数是否相等。#字符串比较#给变量赋值时,等号前后没有空格,有空格时是条件判断string1=abcstring2=bcd#["$string1"="$strin

基座向量施密特正交化

最近再次细细的阅读了向量施密特正交化,重新系统梳理一下一、正交基地与向量的正交分解二、基化成标准正交基,是什么意思将一个向量空间中的基向量通过某种方式转化为一组标准正交基,是指将原有的基向量进行调整,使得它们满足两个条件:彼此之间两两正交(即内积为零);归一化(长度为1)。这样的转换可以用来简化向量空间中的运算,使得向

Linux 本地Yearning SQL 审核平台远程访问

文章目录前言1.Linux部署Yearning2.本地访问Yearning3.Linux安装cpolar4.配置Yearning公网访问地址5.公网远程访问Yearning管理界面6.固定Yearning公网地址前言Yearning简单,高效的MYSQL审计平台一款MYSQLSQL语句/查询审计工具,为DBA与开发人员

热文推荐