zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/3482080.html
Copyright © 2011-2022 走看看