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

时间:2024-03-21 16:34:56

一、简介

用户对应用程序经常有这样的要求:要求它能记住它的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是文件夹,注册表如下图:

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

缺点在于只有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