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

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值