• Qt下存储读写应用程序设置的三种方法


    一、简介

    用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小、位置和密码等等。有三种方法可以实现:

    • 使用注册表;
    • 使用配置文件(.ini);
    • 使用自定义文件(例如.txt)。

    二、使用注册表

    注册表(Registry)是Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。Qt提供了一个QSettings类,在windows平台,它提供了ini文件读写,注册表读写的功能。而且使用也非常简单。

    QSettings::Format有两种:

    • QSettings::NativeFormat 在windows平台下可以读写windows注册表;
    • QSettings::IniFormat 可以读写ini格式的配置文件。

    读写注册表的示例如下:

    //使用常量字符串来指定保存的注册表位置
    QSettings settings("HKEY_CURRENT_USER\Software\aaa",QSettings::NativeFormat);
    settings.setValue("test", "11111");//写键值对
    QString value = settings.value("test", "error").toString();//读键值对
    qDebug() << value; //输出:"11111"
    

    其中aaa是文件夹,注册表如下图:

    缺点在于只有windows系统有注册表,当在Linux系统下就不能使用注册表了。


    三、使用配置文件(.ini)

    INI文件格式(Initialization File)是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,被用来对操作系统或特定程序初始化或进行参数设置。常用于微软Windows操作系统,但除了windows现在很多其他操作系统下面的应用软件也有.ini文件。读写INI文件的示例如下:

    /*** 写入密码和锁屏时间到配置文本中 ***/
    //QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
    QSettings *IniWrite = new QSettings("config.ini", QSettings::IniFormat);
    IniWrite->setValue("passwd", "123456");
    IniWrite->setValue("lockTime", 4);
    //写入完成后删除指针
    delete IniWrite;
    
    /*** 读取配置文件中的密码和锁屏时间 ***/
    //QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
    QSettings *iniRead = new QSettings("config.ini", QSettings::IniFormat);
    QString strPasswd = iniRead->value("passwd").toString();
    int intLock = iniRead->value("lockTime").toInt();
    //读入完成后删除指针
    delete iniRead;
    

    生成的config.ini文件内容如下:

    [General]
    passwd=123456
    lockTime=4
    

    如果调用setValue函数时,已经存在了同名的key,那么新的值会覆盖原来的值。


    四、使用自定义文件

    第三种方法就是使用自定义文件(例如.txt),例如使用读写文本方式保存”密码“、”锁屏时间“等数值时,需要写入特定行,修改"lockTime="后面的锁屏时间数值,文本内容如下:

    passwd=726350
    lockTime=10
    

    因为读写内容不多,所以可以先全部读取,通过 contains() 来找到包含"lockTime="的行,并使用replace加上QRegExp替换成从QLineEdit输入的字串,程序如下所示:

    /*****************将设置的锁屏时间数值写入文本中*****************/
    //读取文本
    QFile file(config.ini);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString strAll;
    QString strLine;
    while (!file.atEnd())
    {
    	strLine = file.readLine();
    	//找到包含"lockTime="的行,并使用replace加上QRegExp替换成从QLineEdit输入的字串
    	if(strLine.contains("lockTime="))
    	{
    		strLine.replace(QRegExp("lockTime=.*"),QString("lockTime=")+ui->timeDataLabel->text()+"
    ");
    	}
    	strAll = strAll+ strLine;
    }
    file.close();
    //写入文本
    file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
    file.write(strAll.toLatin1());
    file.close();
    

    为避免最开始不存在文本的情况下打开文本失败,可以先初始化配置文本,程序如下所示:

    /******************初始化配置文本******************/
    //写入加密后的密码和锁屏时间到配置文本中
    QFile file(config.ini);
    //第一次打开程序时文件不存在,才写入数据初始化文本
    if(!file.exists())
    {
        //QIODevice::Text模式才能正确写入"
    "  QFile::Truncate覆盖原有文本
        file.open(QIODevice::WriteOnly |QIODevice::Text | QFile::Truncate);
        QTextStream out(&file);
        out << "passwd=" << "123456" + "
    ";
        out << "lockTime=" << "4";
        file.close();
    }
    

    config.txt文本内容如下:

    passwd=123456
    lockTime=4
    

  • 相关阅读:
    Tasklet机制
    linux 内核与用户空间通信之netlink使用方法
    inline总结与思考
    PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
    2410下DMA驱动源码分析
    [转]数据库建立索引的一般依据
    [转]性能调优的步骤
    [原] JT SQL Server 性能调优札记之二
    [转]SQL Server 2000执行计划成本(5/5)
    [转]SQL Server 2000执行计划成本(3/5)
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/10966250.html
Copyright © 2020-2023  润新知