Qt下存储读写应用程序设置的三种方法
2024-09-30 16:45:15
一、简介
用户对应用程序经常有这样的要求:要求它能记住它的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
最新文章
- ActiveMQ笔记(2):基于ZooKeeper的HA方案
- ReactNative新手学习之路02第一个RN项目
- Spark Job的提交与task本地化分析(源码阅读八)
- Hash_bzoj1862: [Zjoi2006]GameZ游戏排名系统
- [Xamarin.Android] ActionBar Tips
- 《深入PHP与jQuery开发》读书笔记——Chapter1
- oschina iOS代码库
- 如何在网站中加入markdown
- 文件IO理解
- Linux之tr命令
- JavaScript随机数类型
- JS中有关正则表达式的一些常见应用
- Android动态换肤(二、apk免安装插件方式)
- BBS论坛(十一)
- BGP:所有邻居都启动了BGP,则无须建立首尾逻辑邻居,否则就需要首尾建立逻辑邻居。
- 十四、JavaWeb监听器
- 【杂谈】tocmat是何时写回响应数据报的
- jd-gui在Ubuntu上打不开
- Java基础——Oracle(五)
- 廖雪峰Java6IO编程-2input和output-1inputStream