轉載地址: 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