用户对应用程序经常有这样的要求:要求它能记住它的 settings ,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是 recent files ,等等这些都可以通过 Qsettings 来实现。
我们知道,这些 settings 一般都是存在系统里的,比如 windows 一般都写在系统注册表或者写 INI 文件, mac 系统一般都在 XML 文件里,那么按照一般的标准来说,许多应用程序是用 INI 文件来实现的。而 Qsettings 就是提供了一种方便的方法来存储和恢复应用程序的 settings 。
QSettings 的 API 是基于 Qvariant , Qvariant 是一种数据类型的集合,它包含了大部分通常的 Qt 数据类型,比如 QString , QRec , QImage ,等等。
当我们创建一个 Qsettings 的对象时,我们需要传递给它两个参数,第一个是你公司或者组织的名称,第二个事你的应用程序的名称。比如:
Settings = Qsettings(“MySoft”,”QtPad”)
公司名称: MySoft ,程序名称: QtPad
假如我们在应用程序中多次要用到 Qsettings ,为了简单其间,我们可以在主程序中先如下声明。
QtCore.QCoreApplication.setOrganizationName("MySoft")
QtCore.QCoreApplication.setOrganizationDomain("mysoft.com")
QtCore.QCoreApplication.setApplicationName("QtPad")
当然前提是已经 from PyQt4 import QtCore
然后在应用程序的任何地方想要声明一个 Qsettings 类型的变量,便不需要书写两个参数了,直接用 settings = Qsettings 即可。
那么如何用它来保持应用程序的 settings 信息呢?我们以字典数据类型与之类比,它也有 key ,以及对应的 value 。比如下面例子:
settings = Qsettings(“MySoft”,”QtPad”)
Mainwindow = QmainWindow()
settings.setValue(“pos”,QVariant(Mainwindow.pos())
settings.setValue(“size”,QVariant(Mainwindow.size())
上面两句就是把当前窗口的位置,和大小两个信息记录到了 settings 中,其中的 key 就是 ”pos” 和 ”size” 两个 Qstring 类型,而它所对应的值就是 QVariant 类型的。当然如果我们要写的 key 已在 settings 中存在的话,则会覆盖原来的值,写入新值。
如何读取 Qsettings 里的内容呢?如下:
Pos = settngs.value(“pos”).toPoint()
Size = settings.value(“size”).toSize()
当然如果 key 所对应的 value 是 int 型的,也可 toInt(), 如果没有我们要找的 key ,则会返回一个 null QVariant 如果用 toInt 的话会得到 0 。
那么实际应用中我们一般会如下:
pos= settings.value("pos", QVariant(QPoint(200, 200))).toPoint()
size= settings.value("size", QVariant(QSize(400, 400))).toSize()
self.resize(size)
self.move(pos)
意思是,如果 settings 里有以前存下的 ( 用 setValue 设置的 )pos 和 size 的值,则读取,如果没有,不会返回 null ,而会使用我们给它的起始值—— default value ——即应用程序第一次运行时的情况。
注意:因为 QVariant 是不会提供所有数据类型的转化的,比如有 toInt(),toPoint(),toSize(), 但是却没有对 Qcolor , Qimage 和 Qpixmap 等数据类型的转化,此时我们可以用 QVariant.value (),具体参看 QVariant 模块说明。
下面看看如何在应用程序中使用:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
...
self.readSettings()
...
def readSettings(self):
settings = Qsettings(“MySoft”,”QtPad”)
pos=settings.value("pos",QVariant(QPoint(200,200))).toPoint()
size=settings.value("size",QVariant(QSize(400,400))).toSize()
self.resize(size)
self.move(pos)
def writeSettings(self):
settings = Qsettings(“MySoft”,”QtPad”)
settings.setValue("pos", QVariant(self.pos()))
settings.setValue("size", QVariant(self.size()))
def closeEvent(self,event):
if self.maybeSave():
self.writeSettings()
event.accept()
else:
event.ignore()
上面是一般应用程序的应用方法。
下面再看一些 Qsettings 里常用的 metho :
Qsettings.annKeys(self) 返回所有的 key ,以 list 的形式
Qsettings.applicationName(self) 返回应用程序名称
Qsettings.clear(self) 清楚此 settings 里的内容
Bool Qsettings.contains(self,key) 返回真,如果存在名为 key 的 key
Qsettings.remove(self, keyname) 清楚 key 及其所对应的 value
Qsetting.fileName() 返回写入注册表地址,或者 INI 文件路径
等等,请参看帮助文档。
我们可以探索一下,这些 settings 在应用程序关闭以后到底存到了什么地方呢?
我们可以在上面的程序中的 writeSettings 中,后面加一句话:
Print Settings.fileName()
这个在 windows 下,默认 Qsettings 会打印出这个程序的系统注册表所在地:
这个结果是: HKEY_CURRENT_USERSoftwareMySoftQtPad
如下图:
由此我们可以看出,这个 writesettings 其实就是个写注册表的过程。
当然,我们也可以不写注册表,我们写 ini 文件:
settings = QSettings("./QtPad.ini", QSettings.IniFormat)
settings.setValue("pos", QVariant(self.pos()))
settings.setValue("size", QVariant(self.size()))
就会在当前文件夹下产生一个 QtPad.ini 文件,打开后文件内容为:
[General]
pos=@Point(200 200)
size=@Size(400 400)
更多关于 Qsettings 内容请参考帮助文档。