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_data
self.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, QtWidgets
class 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.translate
Form.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,QDialog
class 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')
#方式2
self.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_data
self.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