通常狀況下,咱們在開發軟件過程當中,都會緩存一些信息到本地,能夠使用輕量級數據庫sqlite,也能夠操做註冊表、讀寫配置文件。sql
關於QSettings的使用前面已經介紹過了,比較詳細,見「更多參考」,下面介紹下QSettings經常使用功能-讀寫註冊表、配置文件。數據庫
無需指定註冊表路徑緩存
通常狀況下,咱們須要定義一個宏,或者常量字符串來指定保存的註冊表位置。bash
#define HKEY_CURRENT_USER_QT "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt"
const QString HKEY_CURRENT_USER_QT = "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt";
無需指定配置文件路徑markdown
通常狀況下,咱們須要定義一個宏,或者常量字符串來指定保存的配置文件位置及名稱。app
#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。ui
在main()函數中,首先設置組織名、產品名。spa
QCoreApplication::setOrganizationName(QString("Digia"));
QCoreApplication::setApplicationName(QString("Qt"));
而後使用QSettings對註冊表進行操做:.net
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
這時,咱們能夠經過查看應用程序輸出窗口獲得輸出結果。
若是咱們須要在同一路徑下創建多個子目錄該怎麼辦,下面介紹兩種方式。
如上,咱們能夠看出,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。一般狀況下,咱們須要對配置進行歸類,例如:用戶名、密碼等信息屬於用戶組,產品名稱、版本號屬於設置組。
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,因此不會被刪掉。
既然這樣,那麼咱們的疑問也就不復存在了。
原文做者:一去丶二三裏
做者博客:去做者博客空間