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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM