1.前言
一般来说,在PyQt5开发软件中,我们希望开发的用户界面软件进过使用后可以记录最后使用的状态,在再次打开软件时可以恢复。省的我们又要浪费时间来再设置一次。
PyQt5中的QSettings 就有这样的作用,他可以用来记录一些简单的软件设置,小数据等软件使用信息。在再次启动软件时,软件就会读取之前保存的QSettings 的数据进行初始化。
2.QSettings 的创建与使用
(1)创建QSettings 对象
方式1.
传递给QSettings 两个参数,第一个是你公司或者组织的名称如:Mysoft,第二个事你的应用程序的名称如:test。来创建一个QSettings 对象
self.app_data = QSettings('Mysoft', 'test')
说明:如果要存储的数据不是很大,推荐用这种方式。
这代码是在总代码中截取的,self. 是类中的关键字。如果不建类来测试,要把self. 去掉。总代码看文章后面。
方式2.
self.app_data = QSettings('config.ini', QSettings.IniFormat)
self.app_data.setIniCodec('UTF-8') # 设置ini文件编码为 UTF-8
第二种方式是通过创建 ini 文件来存储数据,‘config.ini’是文件名,可以自定义。
如果不设置编码为 utf-8 ,直接用笔记本软件打看 ini 文件的中文是乱码的,不利于直接查看阅读 ini 文件。
缺点:如果你的程序还设置了开机自启动的话,开机后打开的程序不会读取 ini 文件进行初始化的,(不知是不是pyqt5的bug,我的是pyqt5 5.15.0 版本),但方式1 就会读取QSettings 对象的数据进行初始化。如果没有设置自启动的话,就没有影响了。
(2)把数据写入QSettings 对象中
def save_info(self):time = QDateTime.currentDateTime() #获取当前时间,并存储在self.qpp_dataself.app_data.setValue('time', time.toString()) #数据0:time.toString()为字符串类型self.text = self.textEdit.toPlainText()#获取当前文本框的内容self.app_data.setValue('self.text1', self.text)#数据1:也是字符串类型a = 1 #数据3:数值类型list = [1,'a',2] #数据4:列表类型bool = True #数据:5:布尔类型dict = {'a':'abc','b':2} #数据6:字典类型self.app_data.setValue('a', a)self.app_data.setValue('list', list)self.app_data.setValue('bool', bool)self.app_data.setValue('dict', dict)
我创建了个 save_info() 函数专门来进行QSettings 的数据存储。
代码说明:
QSettings的存储语句是
self.app_data.setValue('a', a)
self.app_data 是QSettings对象名;setValue 是QSettings存储命令;'a' 是存储关键字,读取时根据他来读取的;a 是要存储的数据。
注意:我分别存储了,字符串、数值、列表、布尔、字典 5种类型的数据来测试QSettings是一什么格式类型来处理各种类型的数据。待会在初始化代码中会比较。
(3)从QSettings对象中读取数据
def init_info(self):time = self.app_data.value('time')self.text = self.app_data.value('self.text1')a = self.app_data.value('a')list = self.app_data.value('list')bool = self.app_data.value('bool')dict = self.app_data.value('dict')print(time) #输出数据的值print(type(time)) #输出数据类型print(self.text)print(type(self.text))print(a)print(type(a))print(list)print(type(list))print(bool)print(type(bool))print(dict)print(type(dict))#初始化文本框的内容self.textEdit.setPlainText(self.text)
我创建了init_info()函数来进行QSettings 数据读取。
代码说明:
a = self.app_data.value('a')
value 是QSettings读取命令;'a' 是要读取数据的关键字
(4)QSettings 存储数据的处理类型
这里探讨一下QSetting在写入,字符串,数值,列表,布尔,字典数据类型后,读取时是以什么类型读取的。创建QSettings对象的方式不同,其结果也不一样。
在方式1时:
在运行总程序后输入hello,world 后点击 保存数据 按钮,最后关闭程序。在再次启动程序是,输出数据和界面结果如下
周五 7月 3 15:52:53 2020
<class 'str'>
hello,world
<class 'str'>
1
<class 'int'>
['1', 'a', '2']
<class 'list'>
true
<class 'str'>
{'a': 'abc', 'b': 2}
<class 'dict'>
由数据结果和上面存储时的类型相比可以看出,字符串,数值,列表,字典类型不变,而布尔类型变成了字符串类型。
在方式2时:
周五 7月 3 16:27:19 2020
<class 'str'>
hello,world,ini
<class 'str'>
1
<class 'str'>
['1', 'a', '2']
<class 'list'>
true
<class 'str'>
{'a': 'abc', 'b': 2}
<class 'dict'>
由数据结果和上面存储时的类型相比可以看出,字符串,列表,字典类型不变,而数值,布尔类型变成了字符串类型。
(5)QSettings数据的删除
#删除QSettings数据
QSettings.clear(self.app_data)
3.测试总代码
3.1 testui.py(ui代码)
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'testui.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(362, 310)self.textEdit = QtWidgets.QTextEdit(Form)self.textEdit.setGeometry(QtCore.QRect(60, 60, 231, 81))self.textEdit.setObjectName("textEdit")self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(60, 190, 75, 23))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(210, 190, 75, 23))self.pushButton_2.setObjectName("pushButton_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton.setText(_translate("Form", "保存数据"))self.pushButton_2.setText(_translate("Form", "删除数据"))
3.2.test.py (调用操作文件)
import sys,os
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5 import QtCore
from PyQt5.QtCore import QSettings, QDateTime
from testui import Ui_Form #引用UI文件,根据调用类型选择继承窗口类型:QMainWindow,QWidget,QDialogclass MyMainWindow(QWidget, Ui_Form):#Widget界面时>>(QWidget,UI_。。),MainWindow类似def __init__(self, parent=None):super(MyMainWindow, self).__init__(parent)self.setupUi(self)#按钮信号连接self.pushButton.clicked.connect(self.button)self.pushButton_2.clicked.connect(self.button_2)#创建Qsettings对象#方式1#self.app_data = QSettings('Mysoft', 'test')#方式2self.app_data = QSettings('config.ini', QSettings.IniFormat)self.app_data.setIniCodec('UTF-8') # 设置ini文件编码为 UTF-8#检查是否有数据进行初始化if os.path.exists('./config.ini'): #方式2#if self.app_data.value('time'): #方式1#如果存在数据就进行初始化self.init_info()else:#没有数据就认为是第一次打开软件,进行第一次QSettings 数据存储self.save_info()def save_info(self):time = QDateTime.currentDateTime() #获取当前时间,并存储在self.qpp_dataself.app_data.setValue('time', time.toString()) #数据0:time.toString()为字符串类型self.text = self.textEdit.toPlainText()#获取当前文本框的内容self.app_data.setValue('self.text1', self.text)#数据1:也是字符串类型a = 1 #数据3:数值类型list = [1,'a',2] #数据4:列表类型bool = True #数据:5:布尔类型dict = {'a':'abc','b':2} #数据6:字典类型self.app_data.setValue('a', a)self.app_data.setValue('list', list)self.app_data.setValue('bool', bool)self.app_data.setValue('dict', dict)def init_info(self):time = self.app_data.value('time')self.text = self.app_data.value('self.text1')a = self.app_data.value('a')list = self.app_data.value('list')bool = self.app_data.value('bool')dict = self.app_data.value('dict')print(time) #输出数据的值print(type(time)) #输出数据类型print(self.text)print(type(self.text))print(a)print(type(a))print(list)print(type(list))print(bool)print(type(bool))print(dict)print(type(dict))#初始化文本框的内容self.textEdit.setPlainText(self.text)def button(self):#进行数据保存self.save_info()def button_2(self):#删除QSettings数据QSettings.clear(self.app_data)if __name__ == "__main__":#适配2k高分辨率屏幕QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)app = QApplication(sys.argv)myWin = MyMainWindow()myWin.show()sys.exit(app.exec_())
源代码下载链接:https://download.csdn.net/download/qq_38463737/12573570