QSettings 用法总结(很好用)

原文  http://hi.baidu.com/fightiger/blog/item/ba69a434f36e18add1a2d350.html

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

[email protected](200 200)

[email protected](400 400)

更多关于Qsettings内容请参考帮助文档。

http://blog.csdn.net/liuguangzhou123/article/details/7359497

时间: 2024-10-24 21:13:41

QSettings 用法总结(很好用)的相关文章

转一个distinct用法,很有帮助

转一个distinct用法,很有帮助 (2011-12-01 15:18:11) 转载▼ 标签: 杂谈 分类: mysql复制 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久. 下面先来看看例子: table id name   1 a   2 b  

ip命令来配置网络接口卡的十种用法(很实用)

在这篇文章中,我们将回顾我们如何分配静态IP地址 , 静态路由 , 默认网关等. 使用ip命令.在Linux 操作系统中最小安装时默认不安装ifconfig这个命令,是用ip这个命令来取代配置IP地址,静态路由,默认网关 然而,ifconfig命令仍然是可用的,可用于大多数的Linux发行版. 如何配置静态IP地址的互联网协议(IPv4) 配置静态IP地址,您需要更新或修改网络配置文件,以一个静态IP地址分配给系统. 必须是超级管理员(root)与su(switch user)从终端或命令提示符

Javascript之document对象用法(很重要)

一.找到元素 document.getElementById("id"):根据id找层,最多找一个 var a=document.getElementById("id"):将找到的元素放到变量a中: document.getElementByname("name"):根据name找,找出来的是数组: document.getElementByTagname("name"):根据标签名找,找出来的是数组: document.ge

js中typeof和instanceof用法区别

typeof和instanceof的区别 typeof和instanceof都可以用来判断变量,它们的用法有很大区别: typeof会返回一个变量的基本类型,只有以下几种:number,boolean,string,object,undefined,function:例: alert(typeof(1));//number alert(typeof("abc"));//string alert(typeof(true));//boolean alert(typeof(m));//und

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>

关于Linux中循环语句for,while,until用法的详解

关于Linux中循环语句for,while,until用法的详解 for,while,until这些循环结构体在Linux的script中是使用非常多的,所以掌握他们的用法是很必要的,以下是我整理的关于这三个命令的一些用法,希望对需要的人有帮助. 一.for循环   结构一 :             for 变量 in 列表 ; do                                            循环体                             done

C++ REST SDK的基本用法

微软开发了一个开源跨平台的http库--C++ REST SDK(http://casablanca.codeplex.com/),又名卡萨布兰卡Casablanca,有个电影也叫这个名字,也许这个库的作者很喜欢这个电影吧.从REST SDK这个名字可以看出它是处理rest API的,对REST不了解的童鞋可以点这里和这里,由于REST API的请求支持application/x-www-form-urlencoded.application/json.application/octet-str

【转】定时自动启动任务crontab命令用法

每个操作系统都有它的自动定时启动程序的功能,Windows有它的任务计划,而Linux对应的功能是crontab. crontab简介 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行.该词来源于希腊语 chronos(χρ?νος),原意是时间. 通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行.这类作业一般

Nmap扫描原理与用法

Nmap扫描原理与用法 2012年6月16日 1     Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具.软件名字Nmap是Network Mapper的简称.Nmap最初是由Fyodor在1997年开始创建的.随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一.最新版的Nmap6.0在2012年5月21日发布,详情请参见:www.nmap.or