转载地址: http://blog.sina.com.cn/s/blog_4b5039210100h3zb.html

用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现。

我们知道,这些settings一般都是存在系统里的,比如windows一般都写在系统注册表或者写INI文件,mac系统一般都在XML文件里,那么按照一般的标准来说,许多应用程序是用INI文件来实现的。而Qsettings就是提供了一种方便的方法来存储和恢复应用程序的settings。

QSettings的API是基于Qvariant,Qvariant是一种数据类型的集合,它包含了大部分通常的Qt数据类型,比如QString,QRec,QImage,等等。

应用程序的任何地方想要声明一个Qsettings类型的变量,便不需要书写两个参数了,直接用settings = Qsettings即可。

那么如何用它来保持应用程序的settings信息呢?我们以字典数据类型与之类比,它也有key,以及对应的value。比如下面例子:

  1. settings = Qsettings(“MySoft”,”QtPad”)
  2. Mainwindow = QmainWindow()
  3. settings.setValue(“pos”,QVariant(Mainwindow.pos())
  4. settings.setValue(“size”,QVariant(Mainwindow.size())

上面两句就是把当前窗口的位置,和大小两个信息记录到了settings中,其中的key就是”pos”和”size”两个Qstring类型,而它所对应的值就是QVariant类型的。当然如果我们要写的key已在settings中存在的话,则会覆盖原来的值,写入新值。

如何读取Qsettings里的内容呢?如下:

  1. Pos = settngs.value(“pos”).toPoint()
  2. Size = settings.value(“size”).toSize()

当然如果key所对应的value是int型的,也可toInt(),如果没有我们要找的key,则会返回一个null QVariant 如果用toInt的话会得到0。

那么实际应用中我们一般会如下:

  1. pos= settings.value("pos", QVariant(QPoint(200, 200))).toPoint()
  2. size= settings.value("size", QVariant(QSize(400, 400))).toSize()
  3. self.resize(size)
  4. self.move(pos)

意思是,如果settings里有以前存下的(用setValue设置的)pos和size的值,则读取,如果没有,不会返回null,而会使用我们给它的起始值——default value——即应用程序第一次运行时的情况。

注意:因为QVariant是不会提供所有数据类型的转化的,比如有toInt(),toPoint(),toSize(),但是却没有对Qcolor,Qimage和Qpixmap等数据类型的转化,此时我们可以用QVariant.value(),具体参看QVariant模块说明。

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

  1. import sys
  2. from PyQt4.QtCore import *
  3. from PyQt4.QtGui import *
  4. class MainWindow(QMainWindow):
  5. def __init__(self):
  6. QMainWindow.__init__(self)
  7.  
  8. self.readSettings()
  9.  
  10. def readSettings(self):
  11. settings = Qsettings(“MySoft”,”QtPad”)
  12. pos=settings.value("pos",QVariant(QPoint(200,200))).toPoint()
  13. size=settings.value("size",QVariant(QSize(400,400))).toSize()
  14. self.resize(size)
  15. self.move(pos)
  16. def writeSettings(self):
  17. settings = Qsettings(“MySoft”,”QtPad”)
  18. settings.setValue("pos", QVariant(self.pos()))
  19. settings.setValue("size", QVariant(self.size()))
  20. def closeEvent(self,event):
  21. if self.maybeSave():
  22. self.writeSettings()
  23. event.accept()
  24. else:
  25. event.ignore()

上面是一般应用程序的应用方法。

下面再看一些Qsettings里常用的method:

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_USER\Software\MySoft\QtPad

如下图:

由此我们可以看出,这个writesettings其实就是个写注册表的过程。

当然,我们也可以不写注册表,我们写ini文件:

  1. settings = QSettings("./QtPad.ini", QSettings.IniFormat)
  2. settings.setValue("pos", QVariant(self.pos()))
  3. settings.setValue("size", QVariant(self.size()))

就会在当前文件夹下产生一个QtPad.ini文件,打开后文件内容为:

  1. [General]
  2. pos=@Point(200 200)
  3. size=@Size(400 400)

一个QSettings类

  1. #!/usr/bin/python
  2. #-*-coding:utf-8-*-
  3.  
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. from PyQt4.Qt import *
  7.  
  8. class Util():
  9. def __init__(self,parent = None):
  10. pass
  11.  
  12. def writeInit(self,path, user_key,user_value):
  13. if(path.isEmpty() | user_key.isEmpty()):
  14. return False
  15. else:
  16. #创建配置文件操作对象
  17. self.config = QSettings(path, QSettings.IniFormat)
  18.  
  19. #将信息写入配置文件
  20. self.config.beginGroup("config")
  21. self.config.setValue(user_key, user_value)
  22. self.config.endGroup()
  23. return True
  24.  
  25. def readInit(self,path, user_key, user_value):
  26. user_value = ""
  27. if(path.isEmpty() | user_key.isEmpty()):
  28. return False
  29. else:
  30. #创建配置文件操作对象
  31. self.config = QSettings(path, QSettings.IniFormat)
  32.  
  33. #读取用户配置信息
  34. user_value = self.config.value(QString("config/") + user_key).toString()
  35. return True

【转载】PyQt QSetting保存设置的更多相关文章

  1. 转载:pyqt线程间通过 信号/槽 通信

    转自:http://blog.sina.com.cn/s/blog_613d5bb701016qzv.html 信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时, ...

  2. 【转载】Pyqt QSplitter分割窗口

    转载来自: http://blog.sina.com.cn/s/blog_4b5039210100h3ih.html 分割窗口在应用程序中经常用到,它可以灵活分布窗口布局,经常用于类似文件资源管理器的 ...

  3. [转载]使用PyQt来编写第一个Python GUI程序

    转载自:http://python.jobbole.com/81276/ 英文版出处:http://pythonforengineers.com/your-first-gui-app-with-pyt ...

  4. 【转载】 Pyqt QStackedWidget堆栈窗体

    转载地址: http://blog.csdn.net/a649518776/article/details/6636578 下面用代码实现上面窗口的设计 # -*- coding: utf-8 -*- ...

  5. 【转载】Pyqt 添加右键菜单方法

    转载地址: http://www.cnblogs.com/yogalau/p/3954042.html?utm_source=tuicool QListWidget 是继承 QWidget 的, 所以 ...

  6. 【转载】pyqt QTableWidget的使用

    转载地址: http://blog.sina.com.cn/s/blog_9b78c91101019sgi.html QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中 ...

  7. 【转载】Pyqt 编写的俄罗斯方块

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from __future__ ...

  8. 【转载】 Pyqt 利用QDataStream对文件进行存取

    # -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys QTextCodec.s ...

  9. 转载:pyqt的signal和solit

    转自:http://blog.csdn.net/hlqyq/article/details/6713828 import sysfrom PyQt5.QtCore import pyqtSignal, ...

随机推荐

  1. ecliplse高亮显示选中的相同变量

    选择:windows-> preferences->java->Editor->Mark Occurences 选择最上的复选框,下面的就有很多了. 其中的Local vari ...

  2. 【USACO 3.1】Humble Numbers(给定质因子组成的第n大的数)

    题意:给你k(≤100)个质数,求质因子只包含它们的第n大的数. 题解: 方法一:维护一个数组,一开始只有给出的质数在里面,用每个质数去乘以数组中每个数,然后归并排序,长度保留到n,一轮接一轮,直到乘 ...

  3. 微信签名算法的服务端实现(.net版本)

    一.概要 微信此次开放JS接口,开放了一大批api权限,即使在未认证的订阅号也可以使用图像接口,音频接口,智能接口,地理位置,界面操作,微信扫一扫等功能.要知道:以前订阅号只能接受和被动回复用户消息而 ...

  4. django创建blog

    如果本文看不懂的,去看的我视频吧!http://www.testpub.cn/ ------------------------------------------- Django 自称是" ...

  5. MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. 【Alpha版本】十天冲刺——日志集合贴

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 Day1 Day2 Day3 Day ...

  7. 【整理】Word OpenXML常用标签

    一.背景 最近在做关于Word内容自动标引,需要了解Word的底层结构,顺便梳理一下OpenXML的标签含义,方便后续开发,提高对OpenXML标签的查找效率,也是一个熟悉的过程. 二.内容 < ...

  8. BZOJ3172: [Tjoi2013]单词

    传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...

  9. POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)

      题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...

  10. 深入理解javascript原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于“闭包”这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知道应用的两种情况即可 ...