转载地址: http://blog.sina.com.cn/s/blog_4b5039210100h3zb.htmlhtml
用户对应用程序常常有这样的要求:要求它能记住它的settings,好比窗口大小,位置,一些别的设置,还有一个常常用的,就是recent files,等等这些均可以经过Qsettings来实现。python
咱们知道,这些settings通常都是存在系统里的,好比windows通常都写在系统注册表或者写INI文件,mac系统通常都在XML文件里,那么按照通常的标准来讲,许多应用程序是用INI文件来实现的。而Qsettings就是提供了一种方便的方法来存储和恢复应用程序的settings。windows
QSettings的API是基于Qvariant,Qvariant是一种数据类型的集合,它包含了大部分一般的Qt数据类型,好比QString,QRec,QImage,等等。app
应用程序的任何地方想要声明一个Qsettings类型的变量,便不须要书写两个参数了,直接用settings = Qsettings便可。ui
那么如何用它来保持应用程序的settings信息呢?咱们以字典数据类型与之类比,它也有key,以及对应的value。好比下面例子:spa
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中存在的话,则会覆盖原来的值,写入新值。3d
如何读取Qsettings里的内容呢?以下:code
Pos = settngs.value(“pos”).toPoint()
Size = settings.value(“size”).toSize()
固然若是key所对应的value是int型的,也可toInt(),若是没有咱们要找的key,则会返回一个null QVariant 若是用toInt的话会获得0。orm
那么实际应用中咱们通常会以下:xml
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里经常使用的method:
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_USER\Software\MySoft\QtPad
以下图:
由此咱们能够看出,这个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类
#!/usr/bin/python #-*-coding:utf-8-*- from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.Qt import * class Util(): def __init__(self,parent = None): pass def writeInit(self,path, user_key,user_value): if(path.isEmpty() | user_key.isEmpty()): return False else: #建立配置文件操做对象 self.config = QSettings(path, QSettings.IniFormat) #将信息写入配置文件 self.config.beginGroup("config") self.config.setValue(user_key, user_value) self.config.endGroup() return True def readInit(self,path, user_key, user_value): user_value = "" if(path.isEmpty() | user_key.isEmpty()): return False else: #建立配置文件操做对象 self.config = QSettings(path, QSettings.IniFormat) #读取用户配置信息 user_value = self.config.value(QString("config/") + user_key).toString() return True