Chinaunix首页 | 论坛 | 博客
  • 博客访问: 654279
  • 博文数量: 63
  • 博客积分: 1265
  • 博客等级: 中尉
  • 技术积分: 789
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-06 21:54
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(3)

2015年(2)

2013年(5)

2012年(20)

2011年(32)

分类: WINDOWS

2012-04-18 16:28:07

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

阅读(13629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~