qt QSettings 用法總結

用戶對應用程序經常有這樣的要求:要求它能記住它的settings,比如窗口大小,位置,一些別的設置,還有一個經常用的,就是recentfiles,等等這些都可以通過Qsettings來實現。

   我們知道,這些settings一般都是存在系統裏的,比如windows一般都寫在系統註冊表或者寫INI文件,mac系統一般都在XML文件裏,那麼按照一般的標準來說,許多應用程序是用INI文件來實現的。而Qsettings就是提供了一種方便的方法來存儲和恢復應用程序的settings

   QSettingsAPI是基於QvariantQvariant是一種數據類型的集合,它包含了大部分通常的Qt數據類型,比如QStringQRecQImage,等等。

   當我們創建一個Qsettings的對象時,我們需要傳遞給它兩個參數,第一個是你公司或者組織的名稱,第二個事你的應用程序的名稱。比如:

   Settings = Qsettings(“MySoft”,”QtPad”)

   公司名稱:MySoft,程序名稱:QtPad

   假如我們在應用程序中多次要用到Qsettings,爲了簡單其間,我們可以在主程序中先如下聲明。

   QtCore.QCoreApplication.setOrganizationName("MySoft")

QtCore.QCoreApplication.setOrganizationDomain("mysoft.com")

QtCore.QCoreApplication.setApplicationName("QtPad")

當然前提是已經 from PyQt4 importQtCore

然後在應用程序的任何地方想要聲明一個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所對應的valueint型的,也可toInt(),如果沒有我們要找的key,則會返回一個nullQVariant 如果用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設置的)possize的值,則讀取,如果沒有,不會返回null,而會使用我們給它的起始值——defaultvalue——即應用程序第一次運行時的情況。

 

注意:因爲QVariant是不會提供所有數據類型的轉化的,比如有toInt(),toPoint(),toSize(),但是卻沒有對QcolorQimageQpixmap等數據類型的轉化,此時我們可以用QVariant.value(),具體參看QVariant模塊說明。

下面看看如何在應用程序中使用:

importsys

fromPyQt4.QtCore import *

fromPyQt4.QtGui import *

classMainWindow(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) 返回真,如果存在名爲keykey

   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)

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章