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()+"\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下存储读写应用程序设置的三种方法的更多相关文章
- QT 窗体控件的透明度设置(三种方法)
整个窗体 当设置QT的窗体(QMainWindow, QDialog)时,直接用 targetForm->setWindowOpacity() 函数即可实现,效果为窗体及窗体内所有控件都透明 ...
- Linux系统下修改环境变量PATH路径的三种方法
这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...
- 设置css三种方法的优先级
有的小伙伴问了,如果有一种情况:对于同一个元素我们同时用了三种方法设置css样式,那么哪种方法真正有效呢?在下面代码中就出现了这种情况 1.使用内联式CSS设置“超酷的互联网”文字为粉色. 2.然后使 ...
- linux动态库默认搜索路径设置的三种方法
众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两 ...
- [CentOS] 环境变量设置的三种方法
在CentOS系统中添加环境变量的方法有几种,推荐第三种方法.这里以添加 TexLive 2017 的环境变量为例进行说明. 1. 修改 ~/.bash_profile 文档,在文末添加以下代码: ...
- Android项目实战(二):安卓应用程序退出的三种方法
现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: ...
- PHP中时区(timezone)设置的三种方法(转)
方法1: (最好的方法)在php.ini里加上找到date.timezone项,设置date.timezone = "Asia/Shanghai",重启环境就ok了. 方法2: 在 ...
- Windows下gcc以及Qt的DLL文件调用之总结(三种方法)
DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...
- Linux下环境变量设置的三种方法
如想将一个路径加入到$PATH中,可以像下面这样做: 1.控制台中设置,不赞成这种方式,因为他只对当前的shell 起作用,换一个shell设置就无效了:$PATH="$PATH" ...
随机推荐
- how to read openstack code: Core plugin and resource extension
本章我们将写一个自己的core plugin 和一个resource extension来加深理解.(阅读本文的前提是你已经理解了restful以及stevedore等内容) 什么是 core plu ...
- Activiti-5.3工作流引擎-源码解析(流程文档解析)
前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成. 代码解析过 ...
- MySQL基础笔记(一) SQL简介+数据类型
MySQL是一个关系型数据库管理系统(RDBMS),它是当前最流行的 RDBMS 之一.MySQL分为社区版和企业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发 ...
- [经典面试题]在O(1)时间删除链表结点
[题目] 给定链表的头指针和一个结点指针.在O(1)时间删除该结点.链表结点的定义例如以下: struct ListNode { int value; struct ListNode* ...
- API Copy Big FIles
public class ApiCopyFile { private const int FO_COPY = 0x0002; private const int FOF_ALLOWUNDO = 0x0 ...
- ABP框架 - 介绍 VS2017调试器无法附加到IIS进程(w3wp.exe) c# 动态实例化一个泛型类
ABP框架 - 介绍 在14,15年间带领几个不同的团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用程序架构基础性的功能却是大同小异,例如认证.授权.请求验证.异常处理. ...
- ubuntu怎么打开.7z和.rar的压缩文件
通过 sudo apt-get install p7zip-rar就会自己主动安装p7zip-full和p7zip-rar两个软件. 之后就能够通过鼠标右键选择 提取到此处 直接解压压缩文件. den ...
- asp.net项目与开源单点登录项目CAS的结合
这段时间搞的一个asp.net mvc项目,采用了单点登录. 这个单点登录就是CAS,一个开源的JAVA项目.当然,这并不影响ASP.NET项目结合它来进行登录.因为各自分工不同:单点登录(管它是不是 ...
- ie6不支持png图片的解决办法
在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...
- ubuntu安装jdk 1.6
linux下安装JDK1.6 1. 去http://java.sun.com/j2se/1.4.2/download.html 下载一个Linux Platform的JDK,建议下载RPM自解压格式的 ...