簡述
普通情況下。我們在開發軟件過程中,都會緩存一些信息到本地,能夠使用輕量級數據庫sqlite。也能夠操作注冊表、讀寫配置文件。
關於QSettings的使用前面已經介紹過了。比較具體,見“很多其它參考”,以下介紹下QSettings經常使用功能-讀寫注冊表、配置文件。
長處
無需指定注冊表路徑
普通情況下,我們須要定義一個宏,或者常量字符串來指定保存的注冊表位置。
#define HKEY_CURRENT_USER_QT "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt"
const QString HKEY_CURRENT_USER_QT = "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt";
無需指定配置文件路徑
普通情況下,我們須要定義一個宏,或者常量字符串來指定保存的配置文件位置及名稱。
#define INI_QT "C:\Users\WangLiang\AppData\Roaming\Digia"
const QString INI_QT = "C:\Users\WangLiang\AppData\Roaming\Digia";
採用以下方式,我們不須要做太多工作。Qt已經非常好的替你實現了!
讀寫注冊表
一般存儲
以下我們以Qt為例。眾所周知如今Qt已經屬於Digia,也就是說:組織名為Digia,產品名為Qt。
在main()函數中,首先設置組織名、產品名。
QCoreApplication::setOrganizationName(QString("Digia"));
QCoreApplication::setApplicationName(QString("Qt"));
然后使用QSettings對注冊表進行操作:
QSettings settings(QSettings::NativeFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
這時,我們打開注冊表regedit。數據就生成了。
一般讀取
存儲完數據之后,默認的程序啟動時須要載入相應的數據。
QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
//Name:Qt Creator Version:5
這時,我們能夠通過查看應用程序輸出窗體得到輸出結果。
分文件夾存儲
假設我們須要在同一路徑下建立多個子文件夾該怎么辦,以下介紹兩種方式。
替換applicationName
如上,我們能夠看出。organizationName相應的注冊表路徑為HKEY_CURRENT_USER\\SoftWare\\Digia
。applicationName相應的為其下一級的文件夾。那么分文件夾就須要更改其相應的applicationName。
QSettings settings(QSettings::NativeFormat, QSettings::UserScope, QString("%1\\%2").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()), "Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
QSettings settings2(QString("%1\\%2").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()), "Qt5.6");
settings2.setValue("Name", "Qt Creator");
settings2.setValue("Version", "5.6");
分組
替換applicationName的方式看起來有些繁瑣,相比之下,使用group分組則會更簡單!
QSettings settings;
settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();
settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();
這時。我們再次查看注冊表數據。
注:
新建文件夾,則須要又一次打開注冊表,假設新加入設置,則不須要又一次打開注冊表,僅僅須要來回切換相應的選項就可以。
讀寫配置文件
一般存儲
如上,我們僅僅須要將格式從NativeFormat變為IniFormat就可以:
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
這時。我們打開相應的存儲文件夾。數據就生成了。
我們能夠進入文件夾:C:\Users\WangLiang\AppData\Roaming
(AppData默覺得隱藏文件,須要設置顯示才可查看)。能夠看到生成了文件夾”Digia”以及配置文件”Qt.ini”。
一般讀取
存儲完數據之后,默認的程序啟動時須要載入相應的數據。
QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
//Name:Qt Creator Version:5
這時。我們能夠通過查看應用程序輸出窗體得到輸出結果。
分組存儲
我們能夠看到配置文件里包括默認的分組為:General。通常情況下,我們須要對配置進行歸類。比如:username、password等信息屬於用戶組,產品名稱、版本屬於設置組。
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());
settings.beginGroup("Setting");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
settings.endGroup();
settings.beginGroup("User");
settings.setValue("UserName", "WangL");
settings.setValue("Password", "123456");
settings.endGroup();
這時我們再次查看配置文件,里面已經生成了另外兩個分組。
分組讀取
settings.beginGroup("Setting");
QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
settings.endGroup();
//Name:Qt Creator Version:5
settings.beginGroup("User");
QString strUserName = settings.value("UserName").toString();
QString strPassword = settings.value("Password").toString();
settings.endGroup();
//UserName:WangL Password:123456
分文件夾存儲
什么時候須要分文件夾存儲呢?QQ大家都用過吧,是不是每個用戶都有一個相應QQ號的文件夾呢,里面保存各個用戶相應的信息。
如上,我們能夠看出,organizationName相應的本地路徑為C:\Users\WangLiang\AppData\Roaming\Digia
,applicationName相應的為其下的配置文件,那么假設我們須要在同一路徑下建立多個文件夾就須要更改相應的organizationName,配置文件名則須要更改其相應的applicationName了。
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QString("%1\\%2\\%3").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()).arg("Qt5.5"), "User");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
QSettings settings2(QSettings::IniFormat, QSettings::UserScope, QString("%1\\%2\\%3").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()).arg("Qt5.5"), "User");
settings2.setValue("Name", "Qt Creator");
settings2.setValue("Version", "5.6");
這時。我們再次查看本地文件,則會發現C:\Users\WangLiang\AppData\Roaming\Digia\Qt
所在文件夾下會生成兩個文件夾”Qt5.5”和”Qt5.6”,而且每個文件夾底下會生成相應的配置文件User.ini。
刪除內容
刪除一個指定的鍵
QSettings settings;
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
settings.remove("Name");
QStringList keys = settings.allKeys();
// keys: ["Version"]
清空全部鍵
settings.clear();
QStringList keys = settings.allKeys();
// keys: []
刪除設置鍵以及子設置鍵
QSettings settings;
settings.setValue("Qt5.6", "5.6");
settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();
settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();
settings.remove("Qt5.6");
QStringList strList = settings.allKeys();
// keys: ["Qt5.5/Name", "Qt5.5/Version"]
假設key為空字符串,在當前group()的全部鍵將被刪除。
QSettings settings;
settings.setValue("Qt5.6", "5.6");
settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();
settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();
settings.beginGroup("Qt5.6");
settings.remove("");
settings.endGroup();
QStringList keys = settings.allKeys();
// keys: ["Qt5.5/Name", "Qt5.5/Version"]
疑問解釋
如上文代碼,我們能夠知道未刪除之前keys: ["Qt5.6", "Qt5.5/Name", "Qt5.5/Version", "Qt5.6/Name", "Qt5.6/Version"]
,當中Qt5.6所在分組為默認的General。
那么調用以下代碼:
settings.beginGroup("Qt5.6");
settings.remove("");
settings.endGroup();
應該僅僅刪除相應組中的全部鍵才對。也就是說剩余的keys應該為 ["Qt5.6", "Qt5.5/Name", "Qt5.5/Version"]
,General下的鍵為什么會被刪除呢?好,這里先跳過,繼續。
General下的鍵既然能夠被刪除,那么在Qt5.5分組下建立相應的Qt5.6鍵值。應該也會被刪除。
刪除前:
刪除后:
什么鬼。為嘛Qt5.5分組下的Qt5.6相應的鍵還在呢?
我們繼續分析:
刪除前:keys: ["Qt5.6", "Qt5.5/Qt5.6", "Qt5.5/Name", "Qt5.5/Version", "Qt5.6/Name", "Qt5.6/Version"]
。
助手中關於remove()的說明為:Removes the setting key and any sub-settings of key.
也就是說:Qt5.5/Qt5.6鍵中即使存在Qt5.6,可是所屬的setting key為Qt5.5而非Qt5.6,所以不會被刪掉。
既然這樣,那么我們的疑問也就不復存在了。