QSettings 用法總結(很好用)


原文  http://hi.baidu.com/fightiger/blog/item/ba69a434f36e18add1a2d350.html

 

     用戶對應用程序經常有這樣的要求:要求它能記住它的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內容請參考幫助文檔。

 

http://blog.csdn.net/liuguangzhou123/article/details/7359497


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM