一、簡介
用戶對應用程序經常有這樣的要求:要求它能記住它的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