【轉載】PyQt QSetting保存設置

轉載地址: 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
相關文章
相關標籤/搜索