1. 程式人生 > >【Qt】QSettings讀寫登錄檔、配置檔案【轉】

【Qt】QSettings讀寫登錄檔、配置檔案【轉】

簡述

一般情況下,我們在開發軟體過程中,都會快取一些資訊到本地,可以使用輕量級資料庫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。通常情況下,我們需要對配置進行歸類,例如:使用者名稱、密碼等資訊屬於使用者組,產品名稱、版本號屬於設定組。

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,所以不會被刪掉。

既然這樣,那麼我們的疑問也就不復存在了。

更多參考

相關推薦

QtQSettings配置檔案

簡述 一般情況下,我們在開發軟體過程中,都會快取一些資訊到本地,可以使用輕量級資料庫sqlite,也可以操作登錄檔、讀寫配置檔案。 關於QSettings的使用前面已經介紹過了,比較詳細,見“更多參考”,下面介紹下QSettings常用功能-讀寫登錄檔、配置檔案。 簡述 優點 讀

C++

1.       登錄檔簡介 登錄檔是為Windows NT和Windows95中所有32位硬體/驅動和32位應用程式設計的資料檔案,用於儲存系統和應用程式的設定資訊。16位驅動在Winnt (Windows New Technology)下無法工作,所以所有裝置都通過登錄

Delphi中

Delphi程式中入如何操作登錄檔,在應用程式中,經常需要對登錄檔進行各種操作,如將程式名稱、安裝路徑等資訊儲存到登錄檔中。32位Delphi程式中可利用TRegistry物件來存取登錄檔檔案中的資訊。 一、建立和釋放TRegistry物件 1.建立TRegistry物件。

Java兩種方式

一種是使用java提供的,但是隻能獲取HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs下的 另外一種是可以指定任意路徑,因為採用的是cmd的命令。 package com.reg; import java.io.BufferedRea

VC類及用法

 程式設計過程中經常會需要對登錄檔進行讀寫操作,這個類可以讓你很方便的對登錄檔進行編輯: 1.類的原始碼,測試環境為VS2012,不同的開發環境下可能需要做適當修改。註釋為簡單的英文,很容易理解。 標頭檔案:Registry.h #ifndef __REGISTRY_H

疑問用python驗證遇到的問題

password () http eas ini contact blog pre python 最近開始斷斷續續學習python,今天加入博客園,作為新人,和各位老師們討教了,以後多多照顧!為了大家能看清楚所以就截圖了,文末尾附源碼,說不定會有那位老師給我指教一番。###

解決php實現頁面註冊功能並實現跳

apple osi posit cti 轉化 put glob log lin 目錄如下: 思路是不通過數據庫等操作實現頁面(頁面比較簡陋,請笑納) 關於register功能 html頁面必要的表單功能 在頭部寫上 寫上條件判斷 if ($_SERVER[‘REQU

win7-64位系統用QSettings

經常使用QT的QSettings了,感覺已經很熟練了,但是突然發現在64位系統上不能寫登錄檔了,最開始我以為是管理員許可權的問題,後來編譯管理員許可權之後發現沒有問題,問題出在win7 64位的重定向上了。這是我找的資料,可以參考一下 //試驗證明這樣除錯時沒有錯誤了,但是

Java學習java程式訪問(win10)

最近在問答社群碰到一個問題,,用java訪問“HKEY_CURRENT_USER”目錄的需求。查了很多資料,,終於搞定了,,在此做以記錄。 一,java官方API(Preferences) 首先,這個類用起來比較方便,,但是有許多限制,,只能訪問“HKE

CAD.net 自動載入外掛dll

RegistryKey LocaIMachine = Registry.LocalMachine; RegistryKey MyPrograrm = LocaIMach

delphi在64位系統下注意事項

HKEY_LOCAL_MACHINE寫這個主鍵下的項,在64位系統下可能會重定向,所以構造時要加KEY_WOW64_64KEY reg := TRegistry.Create(KEY_WRITE or KEY_READ or KEY_WOW64_64KEY); r

MFC程式還是先註釋或者先清理吧!

血的教訓,浪費了大把時間除錯找問題,然而卻不知道MFC自動寫註冊帶來的巨坑有多坑。一次次讓你懷疑人生, 微軟這個設計老子真心想拍死你。 1.自動寫登錄檔,這裡說自動是建立工程自帶SetRegistryKey將巨坑埋下伏筆 2.註冊資訊不是空,講道理應該為空,但老vc都知道軟

C++ 新增環境變數

在站點搭建的時候需要安裝.zip格式的 mysq l和 php的安裝包等,需要將解壓的路徑寫入系統環境變數中,這樣方便在使用mysql或者php的時候不需要新增絕對路徑而直接使用。所以需要將安裝路徑寫入環境變數,如:D:\mywww\server\mysql\5.6\bin

Win7 C# 控制檯程式被拒,需要以管理員身份執行。

      最近寫了一個控制檯程式,將程式的相關資訊註冊到登錄檔中。但是執行的時候提示寫登錄檔被拒。電腦的當前使用者沒有管理員的許可權。         如何給控制檯程式賦管理員的許可權呢?    

[MFC]文件字串HKEY_CLASSES_ROOT.reg檔案

1. 文件字串的定義:     1) 也是LoadFrame可以載入的第四種資源(圖示、選單、加速鍵之外的第四種資源);     2) 定義方式例如: STRINGTABLE PRELOAD DISCARDABLE BEGIN IDR_MAINFRAME

QT 記住密碼方法之一:Qt QSettings配置文件

mat lin syn use current ebe true erp sync 不過本文寫的是明文保存,最好還是加密一下,以防文件被非法讀取/**登錄初始化的時候處理這部分操作*/ Settings cfg("user.ini",QSettings::IniFormat

大數據HDFS部署及文件(包含eclipse hadoop配置

throw 大數據 我的電腦 ssh 生效 manager 方法 slave .sh 一  原理闡述 1‘  DFS     分布式文件系統(即DFS,Distributed File System),指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網

java 文件操作 生成隨機數,寫入txt,然後從txt中讀出

進行 rac 直接 生成隨機數 catch trace buffered 代碼 tac 1.把生成的隨機數寫入到文件中 1 public static void WriterFun(){ 2 //獲得路徑 3 String filep

python-inipythonini文件

clas edr print 代碼 cells order sta read param 【python-ini】python讀寫ini文件 本文實例講述了Python讀寫ini文件的方法。分享給大家供大家參考。具體如下: 比如有一個文件update.ini,裏面有這些

14華為HCIE-StorageCache鏡像&一高低水位&二盤&三策略&四機制

HCIE storage hostman ------------------------------------重要說明------------------------------------以下部分內容來網絡,部分自華為存儲官方教材具體教材內容請移步華為存儲官網進行教材下載 網絡引用內容