用户对应用程序经常有这样的要求:要求它能记住它的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内容请参考帮助文档。

QSettings 使用实例 当需要在程序关闭时保存”状态“信息的更多相关文章

  1. qt 单文档程序关闭时在delete ui处出现segmentation fault

    做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...

  2. indy9在程序关闭时出现terminate thread timeout的BUG解决办法

    indy9在程序关闭时出现terminate thread timeout的BUG解决办法 INDY9线程有BUG,在退出程序的时候会报错:terminate thread timeout(终止线程超 ...

  3. 程序启动读取和关闭时保存应用程序设置(QSettings)

    保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...

  4. 是什么在.NET程序关闭时阻碍进程的退出?

    在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...

  5. Runtime.getRuntime().addShutdownHook(Thread thread) 程序关闭时钩子,优雅退出程序

    根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象.在Runtime 注册后,如果JVM要停止前,这些 shutdown hook 便开始执行.也就是在 ...

  6. 小程序关闭时暂停webview里的音乐

    document.addEventListener("visibilitychange", () => {  if(document.hidden) {     // 页面被 ...

  7. 【转】正确理解PHP程序编译时的错误信息

    我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的.这些错误通常会迷惑PHP编译器.如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧. 编译PHP脚本时, ...

  8. 以下是关于ASP.NET中保存各种信息的对象的比较,理解这些对象的原理,对制作完善的程序来说是相当有必要的(摘至互联网,并非原创--xukunping)

    在ASP.NET中,有很多种保存信息的对象.例如:APPlication,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么?    为了 ...

  9. WPF编程,窗口保持上次关闭时的大小与位置。

    原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...

随机推荐

  1. python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 (博客园的登录机制已经变了,不能用账号和密码登录了 ...

  2. VS2010 VC++ 项目添加引用 出现 Internal CPS Error问题原因及解决办法

    在VS2010 VC++ 项目添加引用时,有时会出现Internal CPS Error错误,提示信息: 'Internal CPS Error: We couldn't find the exist ...

  3. 深入JavaScript模块化编程

    今天看requirejs官网的manual,发现了下面这篇好文章,于是花点时间翻译了一下,翻译不好的地方请指正,谢谢!   推荐阅读原文:) http://www.adequatelygood.com ...

  4. Jni的Jclass JmethodID JfrieldID的差异

    Jni的Jclass JmethodID JfrieldID 这三者都是java类别的属性,本质上都是指标(Pointer).透过这些指标就能快速调用java类别的函数,或存取对象的属性值.在该类别被 ...

  5. C/C++调用java---JNI常用函数

    DefineClass         jclass  DefineClass(JNIEnv *env, jobject loader,  const jbyte *buf, jsize bufLen ...

  6. Glide Picasso Fresco UIL 图片框架 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. hadoop中实现定制Writable类

    Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序. 为了演示如何 ...

  8. 用mysqlslap对MySQL进行压力测试

    MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理.现在看一下这个压力测试工具mysqlslap.关于他的选项手册上以及--help介绍的很详细.我解释一下一些常用的选项.这里要 ...

  9. RS导出Excel交叉表角对应的列占用多列问题

    在Cognos报表展示的时候,很多用户为了计算会把数据报表导出成excel然后再做统计,于是乎我做的一张报表导出成Excel的时候就出现了这样的问题 从上图可以看出交叉表角对应的列 ‘一级手术’和‘二 ...

  10. WebService 之 属性详解

    WebService 主要包含 WebService .SoapDocumentService.WebServiceBinding三个属性.若要允许使用 ASP.NET AJAX 从脚本中调用此 We ...