1. 程式人生 > >QSettings配置讀寫-win註冊表操作-ini文件讀寫

QSettings配置讀寫-win註冊表操作-ini文件讀寫

幫助 adding 寫入 ase star 平臺 讀數 轉載 qstring

版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QSettings配置讀寫-win註冊表操作-ini文件讀寫 本文地址:http://techieliang.com/2017/12/674/ 文章目錄
  • 1. 介紹
  • 2. 創建配置文件
  •  2.1. 配置格式
  •  2.2. 作用域
  •  2.3. 關於組織、程序名
  • 3. 配置文件讀寫
  • 4. 範例
  •  4.1. win下SystemScope、IniFormat
  •  4.2. win下UserScope、IniFormat
  •  4.3. win下不設置IniFormat、UserScope
  •  4.4. win下不設置IniFormat、SystemScope
  •  4.5. win下InvalidFormat、SystemScope
  •  4.6. win下InvalidFormat、UserScope
  • 5. AllKeys
  • 6. 高級
  •  6.1. 自定義讀寫配置方法
  •  6.2. Win特例
  •  6.3. setPath函數-不同模式、範圍的默認路徑

1. 介紹

官方幫助文檔:QSettings

一套完整的配置文件讀寫機制,多平臺支持,支持ini文件讀寫、win下註冊表讀寫等操作。同時支持當前用戶配置及當前系統配置兩個作用範圍。

2. 創建配置文件

配置文件涉及到作用域(scope)、文件名(filename)、組織名(organization)、程序名(application)、配置格式(format)等,下面是可用的構造函數:

  1. QSettings(const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //1
  2. QSettings(Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //2
  3. QSettings(Format format, Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //3
  4. QSettings(const QString &fileName, Format format, QObject *parent = Q_NULLPTR) //3
  5. QSettings(QObject *parent = Q_NULLPTR)

構造方式1在win下自動在註冊表讀寫,2也一樣

3如果設置為ini類型會在”C:/Users/XXXXX/AppData/Roaming/”用戶範圍建立ini文件,”C:/ProgramData/”系統範圍

4可以指定文件名和類型

2.1. 配置格式

Constant Value Description
QSettings::NativeFormat 0 Store the settings using the most appropriate storage format for the platform. On Windows, this means the system registry; on macOS and iOS, this means the CFPreferences API; on Unix, this means textual configuration files in INI format.
QSettings::Registry32Format 2 Windows only: Explicitly access the 32-bit system registry from a 64-bit application running on 64-bit Windows. On 32-bit Windows or from a 32-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7.
QSettings::Registry64Format 3 Windows only: Explicitly access the 64-bit system registry from a 32-bit application running on 64-bit Windows. On 32-bit Windows or from a 64-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7.
QSettings::IniFormat 1 Store the settings in INI files.
QSettings::InvalidFormat 16 Special value returned by registerFormat().

2.2. 作用域

QSettings::UserScope 0 Store settings in a location specific to the current user (e.g., in the user’s home directory).
QSettings::SystemScope 1 Store settings in a global location, so that all users on the same machine access the same set of settings.

如果設置作用域為用戶,則先檢查用戶,如果沒有再檢查系統範圍。如果設置為系統則不會檢查用戶。

2.3. 關於組織、程序名

程序具有全局唯一的組織及程序名,可以直接使用。如果需要單獨建立則不需要

  1. QSettings settings("Moose Soft", "Facturo-Pro");//自定義
  2. //配置全局名稱並使用
  3. QCoreApplication::setOrganizationName("Moose Soft");
  4. QCoreApplication::setApplicationName("Facturo-Pro");
  5. QSettings settings;//此時可以無參數構造

3. 配置文件讀寫

讀寫配置:setValue、value

為了數據的分類明確還提供了配置分組功能,需要使用beginGroupendGroup 註意begin開始後面代碼表示在組內操作,若想訪問組外內容必須先end

讀寫時可以不用group操作,通過以下方式也可表示組的概念:

  1. settings.setValue("mainwindow/size", win->size());
  2. settings.setValue("mainwindow/fullScreen", win->isFullScreen());
  3. settings.setValue("outputpanel/visible", panel->isVisible());
  4. //等效於:
  5. settings.beginGroup("mainwindow");
  6. settings.setValue("size", win->size());
  7. settings.setValue("fullScreen", win->isFullScreen());
  8. settings.endGroup();
  9. settings.beginGroup("outputpanel");
  10. settings.setValue("visible", panel->isVisible());
  11. settings.endGroup();

同時支持數組beginReadArray、beginWriteArray、endArray 註意begin開始後面代碼表示在組內操作,若想訪問組外內容必須先end

除此以外還有remove刪除配置內容,註意此刪除是完全刪除此配置項,不是把當前配置內容制空

在讀數據之前可以使用contains判斷是否有當前key的配置項

還有具有範圍傷害的兩個方法:clear刪除所有配置項(註冊表需要符合組合和程序名,ini就是清空)、allKeys讀取當前group及下屬所有配置項key的名稱

4. 範例

上面的可能看不懂,下面遍歷一遍win下的配置格式和作用域

4.1. win下SystemScope、IniFormat

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSettings>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc,argv);
  6. QSettings config(QSettings::IniFormat, QSettings::SystemScope,"TechieLiang", "testQSettings");
  7. qDebug()<< config.fileName();
  8. //寫入配置文件
  9. config.beginGroup("config");
  10. config.setValue("user_name", "test");
  11. config.setValue("key", 123);
  12. config.endGroup();
  13. config.beginGroup("config");
  14. qDebug()<<config.value("user_name").toString()
  15. <<config.value("key").toInt();
  16. config.beginGroup("config");
  17. return 0;
  18. }
  19. //"C:/ProgramData/TechieLiang/testQSettings.ini"
  20. //"test" 123

4.2. win下UserScope、IniFormat

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSettings>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc,argv);
  6. QSettings config(QSettings::IniFormat, QSettings::UserScope,"TechieLiang", "testQSettings");
  7. qDebug()<< config.fileName();
  8. return 0;
  9. }
  10. //"C:/Users/XXXX/AppData/Roaming/TechieLiang/testQSettings.ini"
  11. //XXXX用戶名

4.3. win下不設置IniFormat、UserScope

  1. QSettings config(QSettings::UserScope,"TechieLiang", "testQSettings");
  2. qDebug()<< config.fileName();
  3. //"\\HKEY_CURRENT_USER\\Software\\TechieLiang\\testQSettings"

4.4. win下不設置IniFormat、SystemScope

  1. QSettings config(QSettings::SystemScope,"TechieLiang", "testQSettings");
  2. //"\\HKEY_LOCAL_MACHINE\\Software\\TechieLiang\\testQSettings"

4.5. win下InvalidFormat、SystemScope

  1. QSettings config(QSettings::InvalidFormat,QSettings::SystemScope,"TechieLiang", "testQSettings");
  2. //"C:/ProgramData/TechieLiang/testQSettings.ini"

4.6. win下InvalidFormat、UserScope

  1. QSettings config(QSettings::InvalidFormat,QSettings::UserScope,"TechieLiang", "testQSettings");
  2. //"C:/Users/XXXX/AppData/Roaming/TechieLiang/testQSettings.ini"
  3. //XXXX用戶名

5. AllKeys

  1. QSettings settings;
  2. settings.setValue("fridge/color", QColor(Qt::white));
  3. settings.setValue("fridge/size", QSize(32, 96));
  4. settings.setValue("sofa", true);
  5. settings.setValue("tv", false);
  6. QStringList keys = settings.allKeys();
  7. // keys: ["fridge/color", "fridge/size", "sofa", "tv"]
  8. settings.beginGroup("fridge");
  9. keys = settings.allKeys();
  10. // keys: ["color", "size"]

6. 高級

6.1. 自定義讀寫配置方法

registerFormat(const QString &extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)

此方法可以註冊自定義格式

  1. bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map);
  2. bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map);
  3. int main(int argc, char *argv[])
  4. {
  5. const QSettings::Format XmlFormat =
  6. QSettings::registerFormat("xml", readXmlFile, writeXmlFile);
  7. QSettings settings(XmlFormat, QSettings::UserScope, "MySoft",
  8. "Star Runner");
  9. ...
  10. }

6.2. Win特例

windows下可能一個key同時具有value和子項目,此時值需要通過Default或“.”來訪問

On Windows, it is possible for a key to have both a value and subkeys. Its default value is accessed by using “Default” or “.” in place of a subkey:

  1. settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway");
  2. settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar");
  3. settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // returns "Milkyway"

6.3. setPath函數-不同模式、範圍的默認路徑

如果開始設置的範圍、配置格式、文件路徑不對,也可以通過此函數修改,主要是按默認路徑

void QSettings::setPath(Format format, Scope scope, const QString &path)

對應的默認路徑如下:

PlatformFormatScopePath
Windows IniFormat UserScope FOLDERID_RoamingAppData
SystemScope FOLDERID_ProgramData
Unix NativeFormat, IniFormat UserScope $HOME/.config
SystemScope /etc/xdg
Qt for Embedded Linux NativeFormat, IniFormat UserScope $HOME/Settings
SystemScope /etc/xdg
macOS and iOS IniFormat UserScope $HOME/.config
SystemScope /etc/xdg
轉載請以鏈接形式標明本文標題和地址:Techie亮博客 » QSettings配置讀寫

QSettings配置讀寫-win註冊表操作-ini文件讀寫