• 【转载】PyQt QSetting保存设置


    转载地址: 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。比如下面例子:

    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里常用的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_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类

    #!/usr/bin/python  
    #-*-coding:utf-8-*-
    
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from PyQt4.Qt import *
    
    class Util():
        def __init__(self,parent = None):
            pass
            
        def writeInit(self,path, user_key,user_value):
            if(path.isEmpty() | user_key.isEmpty()):
                return False
            else:
                #创建配置文件操作对象
                self.config =  QSettings(path, QSettings.IniFormat)
    
                #将信息写入配置文件
                self.config.beginGroup("config")
                self.config.setValue(user_key, user_value)
                self.config.endGroup()
                return True
                
        def readInit(self,path, user_key, user_value):
            user_value = ""
            if(path.isEmpty() | user_key.isEmpty()):
                return False
            else:
            #创建配置文件操作对象
                self.config =  QSettings(path, QSettings.IniFormat)
    
            #读取用户配置信息
                user_value = self.config.value(QString("config/") + user_key).toString()
                return True
  • 相关阅读:
    Codechef之2014FebChallenge
    Codechef之CodeCraft: IIIT Hyderabad
    原创水题
    用图论模型解决dp问题
    [某模拟赛]一道好题
    萌新java入门笔记
    CodeForces 761C 【DP】
    POJ3268【最短路】
    POJ3191【(-2)进制本质】
    POJ3264 【RMQ基础题—ST-线段树】
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4586356.html
Copyright © 2020-2023  润新知