PyQt5随笔:QSettings 的简单使用详说,进行软件的设置状态数据储存与初始化 |
您所在的位置:网站首页 › 登峰软件参数设置怎么保存 › PyQt5随笔:QSettings 的简单使用详说,进行软件的设置状态数据储存与初始化 |
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 hello,world 1 ['1', 'a', '2'] true {'a': 'abc', 'b': 2}由数据结果和上面存储时的类型相比可以看出,字符串,数值,列表,字典类型不变,而布尔类型变成了字符串类型。 在方式2时: 周五 7月 3 16:27:19 2020 hello,world,ini 1 ['1', 'a', '2'] true {'a': 'abc', 'b': 2}由数据结果和上面存储时的类型相比可以看出,字符串,列表,字典类型不变,而数值,布尔类型变成了字符串类型。
(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
|
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |