QSettings 類提供平颱無關的持久性應用程序設置。 更多...
| 頭: |
#include <QSettings>
|
| CMake: |
find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
|
| qmake: |
QT += core
|
| 繼承: | QObject |
注意: 此類的所有函數 可重入 .
注意: 這些函數也是 綫程安全 :
| enum | Format { NativeFormat, Registry32Format, Registry64Format, IniFormat, WebLocalStorageFormat, …, InvalidFormat } |
| ReadFunc | |
| enum | 作用域 { UserScope, SystemScope } |
| SettingsMap | |
| enum | Status { NoError, AccessError, FormatError } |
| WriteFunc |
| QSettings (QObject * parent = nullptr) | |
| QSettings (QSettings::Scope scope , QObject * parent = nullptr) | |
| QSettings (const QString & fileName , QSettings::Format format , QObject * parent = nullptr) | |
| QSettings (const QString & organization , const QString & application = QString(), QObject * parent = nullptr) | |
| QSettings (QSettings::Scope scope , const QString & organization , const QString & application = QString(), QObject * parent = nullptr) | |
| QSettings (QSettings::Format format , QSettings::Scope scope , const QString & organization , const QString & application = QString(), QObject * parent = nullptr) | |
| virtual | ~QSettings () |
| QStringList | allKeys () const |
| QString | applicationName () const |
| void | beginGroup (QAnyStringView prefix ) |
| int | beginReadArray (QAnyStringView prefix ) |
| void | beginWriteArray (QAnyStringView prefix , int size = -1) |
| QStringList | childGroups () const |
| QStringList | childKeys () const |
| void | clear () |
| bool | contains (QAnyStringView key ) const |
| void | endArray () |
| void | endGroup () |
| bool | fallbacksEnabled () const |
| QString | fileName () const |
| QSettings::Format | format () const |
| QString | group () const |
| bool | isAtomicSyncRequired () const |
| bool | isWritable () const |
| QString | organizationName () const |
| void | remove (QAnyStringView key ) |
| QSettings::Scope | scope () const |
| void | setArrayIndex (int i ) |
| void | setAtomicSyncRequired (bool enable ) |
| void | setFallbacksEnabled (bool b ) |
| void | setValue (QAnyStringView key , const QVariant & value ) |
| QSettings::Status | status () const |
| void | sync () |
| QVariant | value (QAnyStringView key ) const |
| QVariant | value (QAnyStringView key , const QVariant & defaultValue ) const |
| QSettings::Format | defaultFormat () |
| QSettings::Format | registerFormat (const QString & extension , QSettings::ReadFunc readFunc , QSettings::WriteFunc writeFunc , Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) |
| void | setDefaultFormat (QSettings::Format format ) |
| void | setPath (QSettings::Format format , QSettings::Scope scope , const QString & path ) |
| virtual bool | event (QEvent * event ) override |
用戶通常期望應用程序跨會話記住其設置 (窗口大小和位置、選項、等等)。此信息常存儲在 Windows 的係統注冊錶中,macOS 和 iOS 的特性列錶文件中。在缺乏標準的 Unix 係統,許多應用程序 (包括 KDE 應用程序) 使用 INI 文本文件。
QSettings 是圍繞這些技術的抽象,使能夠以可移植方式保存和還原應用程序設置。它還支持 自定義存儲格式 .
QSettings 的 API 基於 QVariant ,允許保存大多數基於值的類型,譬如 QString , QRect ,和 QImage ,采用最少努力。
若需要的全是基於內存的非持久性結構,請考慮使用 QMap < QString , QVariant > 代替。
當創建 QSettings 對象時,必須傳遞公司 (或組織) 名稱及應用程序名稱。例如,若産品被稱為 Star Runner 和公司被稱為 MySoft,則構造 QSettings 對象如下:
QSettings settings("MySoft", "Star Runner");
QSettings 對象可以在堆棧或堆上被創建 (即:使用
new
)。構造和銷毀 QSettings 對象是非常快的。
若在應用程序中許多地方使用 QSettings,可能希望指定組織名稱 應用程序名稱使用 QCoreApplication::setOrganizationName () 和 QCoreApplication::setApplicationName (),然後使用默認 QSettings 構造函數:
QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
...
QSettings settings;
(這裏,我們還指定瞭組織的 Internet 域。當有設置時,Internet 域在 macOS 和 iOS 上被用於代替組織名稱,因為 macOS 和 iOS 應用程序按照慣例會使用 Internet 域去標識它們自己。若未設置域,則從組織名稱派生虛假域。見 特定平颱注意事項 瞭解細節)。
QSettings 存儲設置。構成每設置由 QString 指定設置的名稱 ( key ) 和 QVariant 存儲鍵關聯數據。要寫入設置,使用 setValue ()。例如:
settings.setValue("editor/wrapMargin", 68);
若已經存在具有相同鍵的設置,則現有值被新值所覆寫。為提高效率,改變可能不會被立即保存到永久存儲。(可以始終調用 sync () 去提交改變。)
可以獲取設置的值使用 value ():
int margin = settings.value("editor/wrapMargin").toInt();
若沒有采用指定名稱的設置,QSettings 返迴 null QVariant (其可以被轉換成整數 0)。可以指定另一默認值通過把第 2 自變量傳遞給 value ():
int margin = settings.value("editor/wrapMargin", 80).toInt();
要測試給定鍵是否存在,調用 contains ()。要移除鍵關聯設置,調用 remove ()。要獲得所有鍵的列錶,調用 allKeys ()。要移除所有鍵,調用 clear ().
因為
QVariant
屬於 Qt Core 模塊,它不能提供數據類型轉換函數,如
QColor
,
QImage
,和
QPixmap
,其屬於 Qt GUI。換句話說,沒有
toColor()
,
toImage()
,或
toPixmap()
函數在
QVariant
.
取而代之,可以使用 QVariant::value () 模闆函數。例如:
QSettings settings("MySoft", "Star Runner"); QColor color = settings.value("DataPump/bgcolor").value<QColor>();
反嚮轉換 (如,從 QColor to QVariant ) 對於所有支持數據類型是自動通過 QVariant ,包括 GUI 相關類型:
QSettings settings("MySoft", "Star Runner"); QColor color = palette().background().color(); settings.setValue("DataPump/bgcolor", color);
自定義類型注冊采用 qRegisterMetaType () 擁有運算符為流化到和來自 QDataStream 可以使用 QSettings 來存儲。
Setting keys can contain any Unicode characters. The file format and operating system will determine if they are sensitive to case or not. On Windows, the registry and INI files will use case-insensitive keys, while user-specified formats registered with registerFormat () may be either. On Unix systems, keys are always case-sensitive.
To avoid portability problems, follow these simple rules:
可以使用 / 字符作為分隔符來形成分層鍵,類似 Unix 文件路徑。例如:
settings.setValue("mainwindow/size", win->size());
settings.setValue("mainwindow/fullScreen", win->isFullScreen());
settings.setValue("outputpanel/visible", panel->isVisible());
若希望保存 (或還原) 許多采用相同前綴的設置,可以指定前綴使用 beginGroup () 和調用 endGroup () 在末尾。這裏又是相同範例,但此次使用組機製:
settings.beginGroup("mainwindow");
settings.setValue("size", win->size());
settings.setValue("fullScreen", win->isFullScreen());
settings.endGroup();
settings.beginGroup("outputpanel");
settings.setValue("visible", panel->isVisible());
settings.endGroup();
若組的設置是使用 beginGroup (),因此,大多數函數的行為改變。組可以被遞歸設置。
除組外,QSettings 還支持數組概念。見 beginReadArray () 和 beginWriteArray () 瞭解細節。
假定已采用組織名稱 MySoft 和應用程序名稱 Star Runner 創建 QSettings 對象。當查找值時,最多按以下次序搜索 4 個位置:
(見 特定平颱注意事項 瞭解在 Qt 支持的不同平颱,這些位置的有關信息)。
若在第一位置找不到鍵,則在第二位置繼續搜索,依此類推。這使您能夠存儲係統範圍 (或組織範圍) 設置,並在每用戶 (或每應用程序) 的基礎上覆蓋它們。要關閉此機製,調用 setFallbacksEnabled (false).
雖然來自所有 4 個位置的鍵都可用於讀取,但僅第 1 個文件 (為手中應用程序的特定用戶位置) 可寫訪問。要寫入任何其它文件,省略應用程序名稱和/或指定 QSettings::SystemScope (而不是 QSettings::UserScope ,默認)。
讓我們看下範例:
QSettings obj1("MySoft", "Star Runner");
QSettings obj2("MySoft");
QSettings obj3(QSettings::SystemScope, "MySoft", "Star Runner");
QSettings obj4(QSettings::SystemScope, "MySoft");
下錶匯總瞭 QSettings 對象的哪些訪問位置。 X 意味著位置是 QSettings 對象關聯的主要位置,且被用於讀寫;o 意味著位置被用作迴退,當讀取時。
| 位置 |
obj1
|
obj2
|
obj3
|
obj4
|
|---|---|---|---|---|
| 1. 用戶、應用程序 | X | |||
| 2. 用戶、組織 | o | X | ||
| 3. 係統、應用程序 | o | X | ||
| 4. 係統、組織 | o | o | o | X |
這種機製的妙處是它工作於由 Qt 支持的所有平颱,且仍然給予很大靈活性,不要求指定任何文件名 (或注冊錶路徑)。
若想要在所有平颱使用 INI 文件而不是本機 API,可以傳遞 QSettings::IniFormat 作為第一自變量給 QSettings 構造函數,其後是作用域、組織名稱及應用程序名稱:
QSettings settings(QSettings::IniFormat, QSettings::UserScope,
"MySoft", "Star Runner");
注意,INI 文件會丟失數字數據和用於編碼它們的字符串之間的區彆,因此,以數字形式寫入的值會被讀迴成 QString 。數值可以恢復使用 QString::toInt (), QString::toDouble () 和相關函數。
QSettings 經常被用於存儲 GUI 應用程序的狀態。以下範例闡明如何使用 QSettings 去保存和還原應用程序主窗口的幾何體。
void MainWindow::writeSettings() { QSettings settings("Moose Soft", "Clipper"); settings.beginGroup("MainWindow"); settings.setValue("geometry", saveGeometry()); settings.endGroup(); } void MainWindow::readSettings() { QSettings settings("Moose Soft", "Clipper"); settings.beginGroup("MainWindow"); const auto geometry = settings.value("geometry", QByteArray()).toByteArray(); if (geometry.isEmpty()) setGeometry(200, 200, 400, 400); else restoreGeometry(geometry) settings.endGroup(); }
見 窗口幾何體 瞭解為什麼更好的論述,調用 QWidget::resize () 和 QWidget::move () 而不是 QWidget::setGeometry () 去還原窗口幾何體。
The
readSettings()
and
writeSettings()
函數必須從主窗口的構造函數調用,關閉事件處理程序如下所示:
MainWindow::MainWindow() { ... readSettings(); } void MainWindow::closeEvent(QCloseEvent *event) { if (userReallyWantsToQuit()) { writeSettings(); event->accept(); } else { event->ignore(); } }
QSettings 可重入 。這意味著可以同時在不同綫程中使用截然不同的 QSettings 對象。此保證繼續有效,甚至在 QSettings 對象引用相同磁盤文件 (或相同係統注冊錶條目) 時。若透過某一 QSettings 對象修改瞭設置,變化將立即在任何運轉於相同位置且活在相同進程中的其它 QSettings 對象中可見。
QSettings 可以被用於從不同進程 (可以是同時運行的不同應用程序實例,或完全不同的應用程序) 安全地讀寫相同係統位置,當提供的某些條件被滿足。對於 QSettings::IniFormat ,它使用諮詢文件鎖定和智能閤並算法,以確保數據的完整性。工作條件是可寫配置文件必須為常規文件,且必須位於當前用戶可以在其中創建新臨時文件的目錄下。若不是這種情況,就必須使用 setAtomicSyncRequired () 關閉安全性。
注意, sync () 導入由其它進程所造成的改變 (除從此 QSettings 寫入改變外)。
如提及在 迴退機製 章節,QSettings 把應用程序設置存儲在最多 4 位置,取決於設置是用戶特定或係統範圍,及設置是應用程序特定或組織範圍。為簡單起見,假定組織名為 MySoft,應用程序名為 Star Runner。
在 Unix 係統,若文件格式為 NativeFormat ,默認使用下列文件:
$HOME/.config/MySoft/Star Runner.conf
$HOME/.config/MySoft.conf
<dir>/MySoft/Star Runner.conf
<dir>/MySoft.conf
注意:
若 XDG_CONFIG_DIRS 未設置,默認值
/etc/xdg
被使用。
在 macOS 和 iOS,若文件格式為 NativeFormat ,默認情況下使用這些文件:
$HOME/Library/Preferences/com.MySoft.Star Runner.plist
$HOME/Library/Preferences/com.MySoft.plist
/Library/Preferences/com.MySoft.Star Runner.plist
/Library/Preferences/com.MySoft.plist
在 Windows, NativeFormat 設置存儲在下列注冊錶路徑:
HKEY_CURRENT_USER\Software\MySoft\Star Runner
HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults
注意:
在 Windows,對於運行在 WOW64 模式下的 32 位程序,設置存儲在下列注冊錶路徑:
HKEY_LOCAL_MACHINE\Software\WOW6432node
.
若文件格式為 NativeFormat ,這是 Settings/MySoft/Star Runner.conf 在應用程序 Home (主) 目錄。
若文件格式為 IniFormat ,在 Unix、macOS 和 iOS 使用下列文件:
$HOME/.config/MySoft/Star Runner.ini
$HOME/.config/MySoft.ini
<dir>/MySoft/Star Runner.ini
<dir>/MySoft.ini
注意:
若 XDG_CONFIG_DIRS 未設置,默認值
/etc/xdg
被使用。
在 Windows,使用下列文件:
FOLDERID_RoamingAppData\MySoft\Star Runner.ini
FOLDERID_RoamingAppData\MySoft.ini
FOLDERID_ProgramData\MySoft\Star Runner.ini
FOLDERID_ProgramData\MySoft.ini
標識符加前綴通過
FOLDERID_
是要被傳遞給 Win32 API 函數的特殊項 ID 列錶
SHGetKnownFolderPath()
以獲取相應路徑。
FOLDERID_RoamingAppData
通常指嚮
C:\Users\User Name\AppData\Roaming
,也可展示通過環境變量
%APPDATA%
.
FOLDERID_ProgramData
通常指嚮
C:\ProgramData
.
若文件格式為 IniFormat ,這是 Settings/MySoft/Star Runner.ini 在應用程序 Home (主) 目錄。
路徑對於
.ini
and
.conf
文件可以改變使用
setPath
()。在 Unix、macOS 和 iOS,用戶可以覆蓋它們通過設置
XDG_CONFIG_HOME
環境變量;見
setPath
() 瞭解細節。
有時希望訪問存儲在特定文件 (或注冊錶路徑) 中的設置。在所有平颱,若希望直接讀取 INI 文件,可以使用 QSettings 構造函數把文件名作為第一自變量並傳遞 QSettings::IniFormat 作為第 2 自變量。例如:
QSettings settings("/home/petra/misc/myapp.ini", QSettings::IniFormat);
然後,可用使用 QSettings 對象讀寫文件中的設置。
在 macOS 和 iOS,可以訪問特性列錶
.plist
文件通過傳遞
QSettings::NativeFormat
作為第 2 自變量。例如:
QSettings settings("/Users/petra/misc/myapp.plist", QSettings::NativeFormat);
在 Windows,QSettings 允許訪問在係統注冊錶中已采用 QSettings 寫入的設置 (或支持格式的設置,如:字符串數據)。這是通過構造 QSettings 對象做到的,采用注冊錶路徑和 QSettings::NativeFormat .
例如:
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office", QSettings::NativeFormat);
可以照常透過 QSettings 對象讀寫齣現在指定路徑下的所有注冊錶條目 (使用正斜杠而非反斜杠)。例如:
settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0);
注意:如前所述,QSettings 使用反斜杠字符分隔子鍵。其結果是,不能讀寫包含斜杠 (或反斜杠) 的 Windows 注冊錶條目;應該使用本機 windows API,若需要這樣做。
在 Windows,鍵有值和子鍵兩者是可能的。通過使用 Default 或 . 代替子鍵訪問其默認值:
settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway"); settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar"); settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // returns "Milkyway"
在 Windows 外的其它平颱,Default 和 . 將被視為常規子鍵。
雖然 QSettings 試圖消除不同支持平颱之間的差異,但要意識到當移植應用程序時仍有一些差異:
REG_EXPAND_SZ
將改變為
REG_SZ
.
main()
函數,然後使用默認 QSettings 構造函數。另一解決方案是使用預處理器指令,例如:
#ifdef Q_OS_DARWIN QSettings settings( "grenoullelogique.fr" , "Squash" ); #else QSettings settings( "Grenoulle Logique" , "Squash" ); #endif
另請參閱 QVariant and QSessionManager .
此枚舉類型指定存儲格式,用於 QSettings .
| 常量 | 值 | 描述 |
|---|---|---|
QSettings::NativeFormat
|
0
|
使用最適閤平颱的存儲格式存儲設置。在 Windows,這意味著係統注冊錶;在 macOS 和 iOS,這意味著 CFPreferences API;在 Unix,這意味著以 INI 格式正文配置文件。 |
QSettings::Registry32Format
|
2
|
僅 Windows:從 64 位 Windows 運行 64 位應用程序明確訪問 32 位係統注冊錶。在 32 位 Windows 或從 64 位 Windows 運行 32 位應用程序,這的工作如同指定 NativeFormat。該枚舉值在 Qt 5.7 添加。 |
QSettings::Registry64Format
|
3
|
僅 Windows:從 64 位 Windows 運行 32 位應用程序明確訪問 64 位係統注冊錶。在 32 位 Windows 或從 64 位 Windows 運行 64 位應用程序,這的工作如同指定 NativeFormat。該枚舉值在 Qt 5.7 添加。 |
QSettings::IniFormat
|
1
|
將設置存儲在 INI 文件中。注意,INI 文件會丟失數字數據和用於編碼它們的字符串之間的區彆,因此,以數字形式寫入的值會被讀迴成 QString . |
QSettings::WebLocalStorageFormat
|
4
|
僅 WASM (Web 匯編):把用於當前原點的設置存儲於 window.localStorage。若不允許 Cookie,這會迴退到 INI 格式。這為每個原點提供直到 5MB 存儲。但對它的訪問是同步的,且不要求 JSPI。 |
QSettings::WebIndexedDBFormat
|
5
|
僅 WASM (Web 匯編):把當前原點的設置存儲於索引 DB。若不允許 Cookie,這會迴退到 INI 格式。這要求 JSPI,但提供比 WebLocalStorageFormat 的更多存儲。 |
QSettings::InvalidFormat
|
16
|
特殊值的返迴通過 registerFormat (). |
在 Unix,NativeFormat 和 IniFormat 意味著相同事情,除文件擴展名不同外 (
.conf
為 NativeFormat,
.ini
為 IniFormat)。
INI 文件格式是在所有平颱 Qt 所支持的 Windows 文件格式。在缺乏 INI 標準的情況下,我們試著遵循 Microsoft 做法,但有以下例外:
@
基句法以編碼類型。例如:
pos = @Point(100 100)
為最小化兼容性問題,任何
@
未齣現在值第一位置或之後未緊跟 Qt 類型 (
Point
,
Rect
,
Size
,等) 被視為正常字符。
\
) 在文件路徑:
windir = C:\Windows
QSettings 始終視反斜杠為特殊字符,且不提供用於讀取或寫入這種條目的 API。
%
作為鍵中轉義字符。此外,若保存頂層設置 (其中不帶斜綫的鍵,如 someKey),它將齣現在 INI 文件的 General 區間。為避免覆蓋其它鍵,若使用如 General/someKey 的這種鍵保存某些事情,鍵將位於 %General 區間,
not
在 General 區間。
請注意,此行為方式不同於 QSettings behaved in versions of Qt prior to Qt 6. INI files written with Qt 5 or earlier are however fully readable by a Qt 6 based application (unless a ini codec different from utf8 had been set). But INI files written with Qt 6 will only be readable by older Qt versions if you set the "iniCodec" to a UTF-8 textcodec.
另請參閱 registerFormat () 和 setPath ().
typedef 為指嚮采用以下簽名的函數指針:
bool myReadFunc(QIODevice &device, QSettings::SettingsMap &map);
ReadFunc
用於
registerFormat()
作為指嚮讀取一組鍵/值對的函數指針。
ReadFunc
應一次性讀取所有選項,並返迴所有設置在
SettingsMap
容器,其最初為空。
另請參閱 WriteFunc and registerFormat ().
此枚舉指定設置是具體用戶,還是由同一係統的所有用戶共享。
| 常量 | 值 | 描述 |
|---|---|---|
QSettings::UserScope
|
0
|
將設置存儲到當前用戶的特定位置 (如:用戶 Home 主目錄)。 |
QSettings::SystemScope
|
1
|
將設置存儲在全局位置,以便同一計算機中的所有用戶訪問相同設置集。 |
另請參閱 setPath ().
typedef 對於 QMap < QString , QVariant >.
另請參閱 registerFormat ().
下列狀態值是可能的:
| 常量 | 值 | 描述 |
|---|---|---|
QSettings::NoError
|
0
|
沒有齣現錯誤。 |
QSettings::AccessError
|
1
|
發生訪問錯誤 (如:試著寫入隻讀文件)。 |
QSettings::FormatError
|
2
|
發生格式錯誤 (如:加載畸形 INI 文件)。 |
另請參閱 status ().
typedef 為指嚮采用以下簽名的函數指針:
bool myWriteFunc(QIODevice &device, const QSettings::SettingsMap &map);
WriteFunc
用於
registerFormat()
作為指嚮寫入一組鍵/值對的函數指針。
WriteFunc
僅調用一次,所以需要一次性輸齣設置。
另請參閱 ReadFunc and registerFormat ().
返迴值為設置 key 。若設置不存在,返迴 defaultValue .
若未指定默認值,默認 QVariant 被返迴。
Key lookup will either be sensitive or insensitive to case depending on file format and operating system. To avoid portability problems, see the 區間和鍵句法 規則。
範例:
QSettings settings; settings.setValue("animal/snake", 58); settings.value("animal/snake", 1024).toInt(); // returns 58 settings.value("animal/zebra", 1024).toInt(); // returns 1024 settings.value("animal/zebra").toInt(); // returns 0
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
另請參閱 setValue (), contains (),和 remove ().
[explicit]
QSettings::
QSettings
(
QObject
*
parent
= nullptr)
構造 QSettings 對象用於訪問應用程序的設置和組織設置,先前調用 QCoreApplication::setOrganizationName (), QCoreApplication::setOrganizationDomain (),和 QCoreApplication::setApplicationName ().
作用域是 QSettings::UserScope 和格式為 defaultFormat () ( QSettings::NativeFormat 默認情況下)。使用 setDefaultFormat () 在調用此構造函數之前去更改用於此構造函數的默認格式。
代碼
QSettings settings("Moose Soft", "Facturo-Pro");
相當於
QCoreApplication::setOrganizationName("Moose Soft"); QCoreApplication::setApplicationName("Facturo-Pro"); QSettings settings;
若 QCoreApplication::setOrganizationName () 和 QCoreApplication::setApplicationName () 先前未被調用,QSettings 對象將不能讀取或寫入任何設置,且 status () 會返迴 AccessError .
應該提供域 (默認情況下用於 macOS 和 iOS) 和名稱 (默認情況下用於其它地方) 兩者,雖然代碼能對付若隻提供一個,然後 (在所有平颱) 使用它,但這通常反常於不是默認平颱上的文件命名。
另請參閱 QCoreApplication::setOrganizationName (), QCoreApplication::setOrganizationDomain (), QCoreApplication::setApplicationName (),和 setDefaultFormat ().
[explicit]
QSettings::
QSettings
(
QSettings::Scope
scope
,
QObject
*
parent
= nullptr)
構造 QSettings 對象以相同方式如 QSettings( QObject *parent) 但采用給定 scope .
另請參閱 QSettings (QObject *parent).
構造 QSettings 對象為將訪問設置存儲在文件中稱為 fileName ,采用父級 parent 。若文件不存在,創建它。
若
format
is
QSettings::NativeFormat
,含義對於
fileName
從屬平颱。在 Unix,
fileName
是 INI 文件的名稱。在 macOS 和 iOS,
fileName
是名稱對於
.plist
文件。在 Windows,
fileName
是係統注冊錶路徑。
若 format is QSettings::IniFormat , fileName 是 INI 文件的名稱。
警告:
提供此函數是為瞭方便。它能很好地訪問 INI 或
.plist
文件生成通過 Qt,但可能失敗當在發源於其它程序的這種文件中發現某些句法時。尤其,要意識到以下局限性:
@
字符作某些上下文元字符,以編碼 Qt 特定數據類型 (如
@Rect
),因此,可能被誤解當它齣現在純 INI 文件中時。
另請參閱 fileName ().
[explicit]
QSettings::
QSettings
(const
QString
&
organization
, const
QString
&
application
= QString(),
QObject
*
parent
= nullptr)
構造 QSettings 對象為訪問應用程序設置稱為 application 從組織稱為 organization ,和采用父級 parent .
範例:
QSettings settings("Moose Tech", "Facturo-Pro");
作用域設置為 QSettings::UserScope ,和格式設置為 QSettings::NativeFormat (即:調用 setDefaultFormat () 在調用此構造函數不起作用之前)。
另請參閱 setDefaultFormat () 和 迴退機製 .
構造 QSettings 對象為訪問應用程序設置稱為 application 從組織稱為 organization ,和采用父級 parent .
若 scope is QSettings::UserScope ,QSettings 對象首先搜索特定用戶設置,在它搜索係統範圍設置作為迴退之前。若 scope is QSettings::SystemScope ,QSettings 對象忽略特定用戶設置並提供對係統範圍設置的訪問。
存儲格式被設為 QSettings::NativeFormat (即:調用 setDefaultFormat () 在調用此構造函數不起作用之前)。
若未給齣應用程序名稱,QSettings 對象將隻訪問組織範圍的 locations .
另請參閱 setDefaultFormat ().
構造 QSettings 對象為訪問應用程序設置稱為 application 從組織稱為 organization ,和采用父級 parent .
若 scope is QSettings::UserScope ,QSettings 對象首先搜索特定用戶設置,在它搜索係統範圍設置作為迴退之前。若 scope is QSettings::SystemScope ,QSettings 對象忽略特定用戶設置並提供對係統範圍設置的訪問。
若 format is QSettings::NativeFormat ,本機 API 用於存儲設置。若 format is QSettings::IniFormat ,使用 INI 格式。
若未給齣應用程序名稱,QSettings 對象將隻訪問組織範圍的 locations .
[virtual noexcept]
QSettings::
~QSettings
()
銷毀 QSettings 對象。
任何未保存的改變最後被寫入永久存儲。
另請參閱 sync ().
返迴所有鍵的列錶 (包括子鍵),可以被讀取使用 QSettings 對象。
範例:
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList keys = settings.allKeys(); // keys: ["fridge/color", "fridge/size", "sofa", "tv"]
若組的設置是使用 beginGroup (),僅返迴組中的鍵,不帶組前綴:
settings.beginGroup("fridge"); keys = settings.allKeys(); // keys: ["color", "size"]
另請參閱 childGroups () 和 childKeys ().
返迴用於存儲設置的應用程序名稱。
另請參閱 QCoreApplication::applicationName (), format (), scope (),和 organizationName ().
追加 prefix 到當前組。
當前組自動前置所有指定鍵到 QSettings 。此外,查詢函數譬如 childGroups (), childKeys (),和 allKeys () 都是基於組的。默認情況下,未設置組。
組對避免一遍又一遍地鍵入相同設置路徑很有用。例如:
settings.beginGroup("mainwindow"); settings.setValue("size", win->size()); settings.setValue("fullScreen", win->isFullScreen()); settings.endGroup(); settings.beginGroup("outputpanel"); settings.setValue("visible", panel->isVisible()); settings.endGroup();
這將設置 3 個設置值:
mainwindow/size
mainwindow/fullScreen
outputpanel/visible
調用 endGroup () 以將當前組重置到調用相應 beginGroup() 之前的狀態。組可以嵌套。
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
添加 prefix 到當前組並從數組開始讀取。返迴數組的大小。
範例:
struct Login { QString userName; QString password; }; QList<Login> logins; ... QSettings settings; int size = settings.beginReadArray("logins"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); Login login; login.userName = settings.value("userName").toString(); login.password = settings.value("password").toString(); logins.append(login); } settings.endArray();
使用 beginWriteArray () 以首先寫入數組。
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
另請參閱 beginWriteArray (), endArray (),和 setArrayIndex ().
添加 prefix 到當前組並開始寫入數組大小 size 。若 size 為 -1 (默認),它是基於所寫條目的索引自動確定的。
若某組鍵多次齣現,則可以使用數組來讓您的生活變得更輕鬆。例如,假設想要保存用戶名和口令的可變長度列錶。那麼可以寫:
struct Login { QString userName; QString password; }; QList<Login> logins; ... QSettings settings; settings.beginWriteArray("logins"); for (qsizetype i = 0; i < logins.size(); ++i) { settings.setArrayIndex(i); settings.setValue("userName", logins.at(i).userName); settings.setValue("password", logins.at(i).password); } settings.endArray();
生成鍵將擁有形式
logins/size
logins/1/userName
logins/1/password
logins/2/userName
logins/2/password
logins/3/userName
logins/3/password
要讀迴數組,使用 beginReadArray ().
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
另請參閱 beginReadArray (), endArray (),和 setArrayIndex ().
返迴包含可讀取鍵的所有鍵頂層組的列錶,讀取使用 QSettings 對象。
範例:
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList groups = settings.childGroups(); // groups: ["fridge"]
若組的設置是使用 beginGroup (),返迴該組中的首級鍵,不帶組前綴。
settings.beginGroup("fridge"); groups = settings.childGroups(); // groups: []
可以導航透過整個設置層次結構使用 childKeys () 和 childGroups() 遞歸。
另請參閱 childKeys () 和 allKeys ().
返迴所有頂層鍵的列錶,可以被讀取使用 QSettings 對象。
範例:
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList keys = settings.childKeys(); // keys: ["sofa", "tv"]
若組的設置是使用 beginGroup (),僅返迴組中的頂層鍵,不帶組前綴:
settings.beginGroup("fridge"); keys = settings.childKeys(); // keys: ["color", "size"]
可以導航透過整個設置層次結構使用 childKeys() 和 childGroups () 遞歸。
另請參閱 childGroups () 和 allKeys ().
移除首要位置中的所有條目,關聯此 QSettings 對象。
不移除迴退位置條目。
若隻想移除的條目在當前 group (),使用 remove("") 代替。
另請參閱 remove () 和 setFallbacksEnabled ().
返迴
true
若存在設置被稱為
key
;否則返迴 false。
若組的設置是使用 beginGroup (), key 被認為是相對於該組的。
Key lookup will either be sensitive or insensitive to case depending on file format and operating system. To avoid portability problems, see the 區間和鍵句法 規則。
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
[static]
QSettings::Format
QSettings::
defaultFormat
()
返迴用於存儲設置的默認文件格式為 QSettings ( QObject *) 構造函數。若未設置默認格式, QSettings::NativeFormat 被使用。
另請參閱 setDefaultFormat () 和 format ().
關閉已啓動數組使用 beginReadArray () 或 beginWriteArray ().
另請參閱 beginReadArray () 和 beginWriteArray ().
重置組狀態先前的相應 beginGroup () 調用。
範例:
settings.beginGroup("alpha"); // settings.group() == "alpha" settings.beginGroup("beta"); // settings.group() == "alpha/beta" settings.endGroup(); // settings.group() == "alpha" settings.endGroup(); // settings.group() == ""
另請參閱 beginGroup () 和 group ().
[override virtual protected]
bool
QSettings::
event
(
QEvent
*
event
)
重實現: QObject::event (QEvent *e).
返迴
true
若迴退被啓用;返迴
false
否則。
默認情況下,迴退是啓用的。
另請參閱 setFallbacksEnabled ().
返迴寫入設置的路徑,使用此 QSettings 對象存儲。
在 Windows,若格式為 QSettings::NativeFormat ,返迴值是係統注冊錶路徑,而非文件路徑。
另請參閱 isWritable () 和 format ().
返迴用於存儲設置的格式。
另請參閱 defaultFormat (), fileName (), scope (), organizationName (),和 applicationName ().
返迴當前組。
另請參閱 beginGroup () 和 endGroup ().
返迴
true
if
QSettings
隻允許履行設置的原子保存和重新加載 (同步)。返迴
false
若允許將設置內容直接保存到配置文件。
默認為
true
.
另請參閱 setAtomicSyncRequired () 和 QSaveFile .
返迴
true
若設置可以寫入使用此
QSettings
對象;返迴
false
否則。
為什麼 isWritable() 可能返迴 false 的原因之一是若 QSettings 運轉於隻讀文件。
警告: 此函數並不完美可靠,因為文件權限可以隨時改變。
另請參閱 fileName (), status (),和 sync ().
返迴用於存儲設置的組織名稱。
另請參閱 QCoreApplication::organizationName (), format (), scope (),和 applicationName ().
[static]
QSettings::Format
QSettings::
registerFormat
(const
QString
&
extension
,
QSettings::ReadFunc
readFunc
,
QSettings::WriteFunc
writeFunc
,
Qt::CaseSensitivity
caseSensitivity
= Qt::CaseSensitive)
注冊自定義存儲格式。當成功時,返迴特殊格式值,然後將其傳遞給 QSettings 構造函數。當故障時,返迴 InvalidFormat .
The extension 是關聯格式 (沒有 .) 的文件擴展名。
The readFunc and writeFunc 參數是指嚮讀寫一組鍵/值對的函數指針。 QIODevice 的讀寫函數參數始終以二進製方式被打開 (即,沒有 QIODeviceBase::Text 標誌)。
The
caseSensitivity
parameter specifies whether keys are case-sensitive or not. This makes a difference when looking up values using
QSettings
. The default is case-sensitive. The parameter must be
Qt::CaseSensitive
on Unix systems.
默認情況下,若使用就組織名稱和應用程序名稱而言工作的某一構造函數,則所用文件係統位置如同 IniFormat 。使用 setPath () 去指定其它位置。
範例:
bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map); bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map); int main(int argc, char *argv[]) { const QSettings::Format XmlFormat = QSettings::registerFormat("xml", readXmlFile, writeXmlFile); QSettings settings(XmlFormat, QSettings::UserScope, "MySoft", "Star Runner"); ... }
注意: 此函數是 綫程安全 .
另請參閱 setPath ().
移除設置 key 和任何子設置為 key .
範例:
QSettings settings; settings.setValue("ape"); settings.setValue("monkey", 1); settings.setValue("monkey/sea", 2); settings.setValue("monkey/doe", 4); settings.remove("monkey"); QStringList keys = settings.allKeys(); // keys: ["ape"]
注意,若某一迴退位置包含具有相同鍵的設置,在調用 remove() 後該設置將可見。
若 key 為空字符串,所有鍵在當前 group () 被移除。例如:
QSettings settings; settings.setValue("ape"); settings.setValue("monkey", 1); settings.setValue("monkey/sea", 2); settings.setValue("monkey/doe", 4); settings.beginGroup("monkey"); settings.remove(""); settings.endGroup(); QStringList keys = settings.allKeys(); // keys: ["ape"]
Key lookup will either be sensitive or insensitive to case depending on file format and operating system. To avoid portability problems, see the 區間和鍵句法 規則。
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
另請參閱 setValue (), value (),和 contains ().
返迴用於存儲設置的作用域。
另請參閱 format (), organizationName (),和 applicationName ().
將當前數組索引設為 i 。調用函數,譬如 setValue (), value (), remove (),和 contains () 將運轉於該索引數組條目。
必須調用 beginReadArray () 或 beginWriteArray () 在可以調用此函數之前。
配置是否
QSettings
要求履行設置的原子保存和重新加載 (同步)。若
enable
自變量為
true
(默認),
sync
() 隻會履行同步原子操作。若這不可能,
sync
() 會失敗且
status
() 將是錯誤條件。
把此特性設為
false
將允許
QSettings
直接寫入配置文件並忽略任何錯誤嘗試 (鎖定它阻止試著同時寫入的其它進程)。由於潛在破壞,應小心使用此選項,但在某些情況下是必需的,像
QSettings::IniFormat
配置文件 (存在於其它不可寫目錄下或 NTFS 備用數據流中)。
見 QSaveFile 瞭解有關特徵的更多信息。
另請參閱 isAtomicSyncRequired () 和 QSaveFile .
[static]
void
QSettings::
setDefaultFormat
(
QSettings::Format
format
)
將默認文件格式設為給定 format ,用於存儲設置為 QSettings ( QObject *) 構造函數。
若未設置默認格式, QSettings::NativeFormat 被使用。見文檔編製瞭解 QSettings 構造函數,查看構造函數是否會忽略此函數。
另請參閱 defaultFormat () 和 format ().
把是否啓用迴退設為 b .
默認情況下,迴退是啓用的。
另請參閱 fallbacksEnabled ().
[static]
void
QSettings::
setPath
(
QSettings::Format
format
,
QSettings::Scope
scope
, const
QString
&
path
)
設置用於存儲設置的路徑為給定 format and scope ,到 path 。 format 可以是自定義格式。
下錶匯總瞭默認值:
| 平颱 | 格式 | 作用域 | 路徑 |
|---|---|---|---|
| Windows | IniFormat | UserScope |
FOLDERID_RoamingAppData
|
| SystemScope |
FOLDERID_ProgramData
|
||
| Unix | NativeFormat , IniFormat | UserScope |
$HOME/.config
|
| SystemScope |
/etc/xdg
|
||
| macOS 和 iOS | IniFormat | UserScope |
$HOME/.config
|
| SystemScope |
/etc/xdg
|
默認
UserScope
路徑在 Unix、macOS 及 iOS (
$HOME/.config
或 $HOME/Settings) 可以由用戶覆蓋通過設置
XDG_CONFIG_HOME
環境變量。默認
SystemScope
路徑在 Unix、macOS 及 iOS (
/etc/xdg
) 可以被覆蓋當構建 Qt 庫使用
configure
腳本的
-sysconfdir
標誌 (見
QLibraryInfo
瞭解細節)。
設置 NativeFormat 路徑在 Windows、macOS 及 iOS,無效。
警告: 此函數不影響現有 QSettings 對象。
另請參閱 registerFormat ().
設置值為設置 key to value 。若 key 已存在,先前值被覆寫。
Key lookup will either be sensitive or insensitive to case depending on file format and operating system. To avoid portability problems, see the 區間和鍵句法 規則。
範例:
QSettings settings; settings.setValue("interval", 30); settings.value("interval").toInt(); // returns 30 settings.setValue("interval", 6.55); settings.value("interval").toDouble(); // returns 6.55
注意: Qt 6.4 之前,此函數接受 QString , not QAnyStringView .
另請參閱 value (), remove (),和 contains ().
返迴狀態碼指示遇到的首個錯誤通過 QSettings ,或 QSettings::NoError 若沒有齣現錯誤。
要意識到, QSettings 延遲履行某些操作。齣於此原因,可能想要調用 sync () 以確保數據存儲在 QSettings 被寫入磁盤在調用 status() 之前。
另請參閱 sync ().
把任何未保存改變寫入永久存儲,並重新加載同時已被另一應用程序改變的任何設置。
此函數被自動調用從 QSettings 的析構函數和通過定期間隔的事件循環,因此,通常不需要自己調用它。
另請參閱 status ().