一、简介

用户对应用程序经常有这样的要求:要求它能记住它的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()+"\n");
}
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模式才能正确写入"\n" QFile::Truncate覆盖原有文本
file.open(QIODevice::WriteOnly |QIODevice::Text | QFile::Truncate);
QTextStream out(&file);
out << "passwd=" << "123456" + "\n";
out << "lockTime=" << "4";
file.close();
}

config.txt文本内容如下:

passwd=123456
lockTime=4

Qt下存储读写应用程序设置的三种方法的更多相关文章

  1. QT 窗体控件的透明度设置(三种方法)

    整个窗体 当设置QT的窗体(QMainWindow, QDialog)时,直接用 targetForm->setWindowOpacity()   函数即可实现,效果为窗体及窗体内所有控件都透明 ...

  2. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  3. 设置css三种方法的优先级

    有的小伙伴问了,如果有一种情况:对于同一个元素我们同时用了三种方法设置css样式,那么哪种方法真正有效呢?在下面代码中就出现了这种情况 1.使用内联式CSS设置“超酷的互联网”文字为粉色. 2.然后使 ...

  4. linux动态库默认搜索路径设置的三种方法

    众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两 ...

  5. [CentOS] 环境变量设置的三种方法

    在CentOS系统中添加环境变量的方法有几种,推荐第三种方法.这里以添加 TexLive 2017 的环境变量为例进行说明. 1. 修改  ~/.bash_profile  文档,在文末添加以下代码: ...

  6. Android项目实战(二):安卓应用程序退出的三种方法

    现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: ...

  7. PHP中时区(timezone)设置的三种方法(转)

    方法1: (最好的方法)在php.ini里加上找到date.timezone项,设置date.timezone = "Asia/Shanghai",重启环境就ok了. 方法2: 在 ...

  8. Windows下gcc以及Qt的DLL文件调用之总结(三种方法)

    DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...

  9. Linux下环境变量设置的三种方法

    如想将一个路径加入到$PATH中,可以像下面这样做: 1.控制台中设置,不赞成这种方式,因为他只对当前的shell 起作用,换一个shell设置就无效了:$PATH="$PATH" ...

随机推荐

  1. how to read openstack code: Core plugin and resource extension

    本章我们将写一个自己的core plugin 和一个resource extension来加深理解.(阅读本文的前提是你已经理解了restful以及stevedore等内容) 什么是 core plu ...

  2. Activiti-5.3工作流引擎-源码解析(流程文档解析)

    前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成. 代码解析过 ...

  3. MySQL基础笔记(一) SQL简介+数据类型

    MySQL是一个关系型数据库管理系统(RDBMS),它是当前最流行的 RDBMS 之一.MySQL分为社区版和企业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发 ...

  4. [经典面试题]在O(1)时间删除链表结点

    [题目] 给定链表的头指针和一个结点指针.在O(1)时间删除该结点.链表结点的定义例如以下: struct ListNode { int        value; struct ListNode*  ...

  5. API Copy Big FIles

    public class ApiCopyFile { private const int FO_COPY = 0x0002; private const int FOF_ALLOWUNDO = 0x0 ...

  6. ABP框架 - 介绍 VS2017调试器无法附加到IIS进程(w3wp.exe) c# 动态实例化一个泛型类

    ABP框架 - 介绍   在14,15年间带领几个不同的团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用程序架构基础性的功能却是大同小异,例如认证.授权.请求验证.异常处理. ...

  7. ubuntu怎么打开.7z和.rar的压缩文件

    通过 sudo apt-get install p7zip-rar就会自己主动安装p7zip-full和p7zip-rar两个软件. 之后就能够通过鼠标右键选择 提取到此处 直接解压压缩文件. den ...

  8. asp.net项目与开源单点登录项目CAS的结合

    这段时间搞的一个asp.net mvc项目,采用了单点登录. 这个单点登录就是CAS,一个开源的JAVA项目.当然,这并不影响ASP.NET项目结合它来进行登录.因为各自分工不同:单点登录(管它是不是 ...

  9. ie6不支持png图片的解决办法

    在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...

  10. ubuntu安装jdk 1.6

    linux下安装JDK1.6 1. 去http://java.sun.com/j2se/1.4.2/download.html 下载一个Linux Platform的JDK,建议下载RPM自解压格式的 ...