qt QSettings 用法总结

用户对应用程序经常有这样的要求:要求它能记住它的 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

    如下图:

 

    qt QSettings 用法总结_第1张图片

由此我们可以看出,这个 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 内容请参考帮助文档。

你可能感兴趣的:(qt QSettings 用法总结)