QSettings Class
QSettings類提供與平臺無關的持久性應用程序設置。
Header: | #include <QSettings> |
qmake: | QT += core |
Inherits: | QObject |
注意:此類中的所有函數都是可重入的。
注意:這些函數也是線程安全的。
Public Types:
enum | Format { NativeFormat, Registry32Format, Registry64Format, IniFormat, InvalidFormat } |
typedef | ReadFunc |
enum | Scope { UserScope, SystemScope } |
typedef | SettingsMap |
enum | Status { NoError, AccessError, FormatError } |
typedef | WriteFunc |
Public Functions:
QSettings(QSettings::Scope scope, QObject *parent = nullptr) | |
QSettings(QObject *parent = nullptr) | |
QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr) | |
QSettings(QSettings::Format format, QSettings::Scope scope, 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(const QString &organization, const QString &application = QString(), QObject *parent = nullptr) | |
virtual | ~QSettings() |
QStringList | allKeys() const |
QString | applicationName() const |
void | beginGroup(const QString &prefix) |
int | beginReadArray(const QString &prefix) |
void | beginWriteArray(const QString &prefix, int size = -1) |
QStringList | childGroups() const |
QStringList | childKeys() const |
void | clear() |
bool | contains(const QString &key) const |
void | endArray() |
void | endGroup() |
bool | fallbacksEnabled() const |
QString | fileName() const |
QSettings::Format | format() const |
QString | group() const |
QTextCodec * | iniCodec() const |
bool | isAtomicSyncRequired() const |
bool | isWritable() const |
QString | organizationName() const |
void | remove(const QString &key) |
QSettings::Scope | scope() const |
void | setArrayIndex(int i) |
void | setAtomicSyncRequired(bool enable) |
void | setFallbacksEnabled(bool b) |
void | setIniCodec(QTextCodec *codec) |
void | setIniCodec(const char *codecName) |
void | setValue(const QString &key, const QVariant &value) |
QSettings::Status | status() const |
void | sync() |
QVariant | value(const QString &key, const QVariant &defaultValue = QVariant()) const |
Static Public Members
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) |
Reimplemented Protected Functions保護方法
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和一個QVariant組成,該QString指定設置的名稱(鍵),該QVariant存儲與該鍵關聯的數據。 要編寫設置,請使用setValue()。 例如:
settings.setValue("editor/wrapMargin", 68);
如果已經存在具有相同鍵的設置,則現有值將被新值覆蓋。 爲了提高效率,更改可能不會立即保存到永久存儲中。 (您始終可以調用sync()提交更改。)
您可以使用value()返回設置的值:
int margin = settings.value("editor/wrapMargin").toInt();
如果沒有具有指定名稱的設置,則QSettings返回一個空QVariant(可以將其轉換爲整數0)。 您可以通過將第二個參數傳遞給value()來指定另一個默認值:
int margin = settings.value("editor/wrapMargin", 80).toInt();
要測試給定密鑰是否存在,請調用contains()。 要刪除與鍵關聯的設置,請調用remove()。 要獲取所有鍵的列表,請調用allKeys()。 要刪除所有鍵,請調用clear()。
QVariant和GUI類型
由於QVariant是Qt Core模塊的一部分,因此它無法提供對Qt GUI的一部分的數據類型(例如QColor,QImage和QPixmap)的轉換功能。 換句話說,在QVariant中沒有toColor(),toImage()或toPixmap()函數。
相反,您可以使用QVariant :: value()模板函數。 例如:
QSettings settings("MySoft", "Star Runner");
QColor color = settings.value("DataPump/bgcolor").value<QColor>();
對於QVariant支持的所有數據類型,包括與GUI相關的類型,將自動進行逆轉換(例如,從QColor到QVariant):
QSettings settings("MySoft", "Star Runner");
QColor color = palette().background().color();
settings.setValue("DataPump/bgcolor", color);
可以使用QSettings存儲使用qRegisterMetaType()和qRegisterMetaTypeStreamOperators()註冊的自定義類型。
Section and Key語法:鍵值和內容語法
設置鍵可以包含任何Unicode字符。 Windows註冊表和INI文件使用不區分大小寫的鍵,而macOS和iOS上的CFPreferences API使用不區分大小寫的鍵。 爲避免可移植性問題,請遵循以下簡單規則:
- 總是使用相同的情況引用相同的密鑰。
- 避免使用除大小寫外相同的鍵名。
- 不要在節名或鍵名中使用斜槓(“/”和“\”);反斜槓字符用於分隔子鍵(見下文)。在windows上,“\”由QSettings轉換爲“/”,這使它們相同。
您可以使用'/'字符作爲分隔符來形成分層鍵,類似於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()。
後備機制
假設您已經創建了一個QSettings對象,其組織名稱爲MySoft,應用程序名稱爲Star Runner。查找值時,將按此順序搜索最多四個位置:
- Star Runner應用程序的用戶特定位置
- MySoft所有應用程序的用戶特定位置
- Star Runner應用程序在系統範圍內的位置
- MySoft在所有應用程序的系統範圍內的位置
(有關Qt支持的不同平臺上這些位置的信息,請參閱下面的特定於平臺的說明。)
如果在第一個位置找不到密鑰,則在第二個位置繼續搜索,依此類推。 這使您可以存儲系統範圍或組織範圍的設置,並可以基於每個用戶或每個應用程序覆蓋它們。 要關閉此機制,請調用setFallbacksEnabled(false)。
儘管可以從所有四個位置讀取密鑰,但是隻能訪問第一個文件(應用程序的用戶特定位置)進行寫入。 要寫入任何其他文件,請省略應用程序名稱 and/or 指定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”表示該位置在讀取時用作備用。
Locations | obj1 |
obj2 |
obj3 |
obj4 |
---|---|---|---|---|
1. User, Application | X | |||
2. User, Organization | o | X | ||
3. System, Application | o | X | ||
4. System, Organization | o | o | o | X |
這種機制的優點在於,它可以在Qt支持的所有平臺上運行,並且仍然爲您提供了很大的靈活性,而無需您指定任何文件名或註冊表路徑。
如果要在所有平臺上使用INI文件而不是本機API,則可以將QSettings :: IniFormat作爲第一個參數傳遞給QSettings構造函數,然後是範圍,組織名稱和應用程序名稱:
QSettings settings(QSettings::IniFormat, QSettings::UserScope,
"MySoft", "Star Runner");
請注意,從INI文件讀取設置時不會保留類型信息。 所有值將作爲QString返回。
設置編輯器示例可讓您嘗試不同的設置位置,以及啓用或禁用後備機制。
恢復GUI應用程序的狀態
QSettings通常用於存儲GUI應用程序的狀態。 下面的示例說明如何使用QSettings保存和還原應用程序主窗口的幾何信息。
void MainWindow::writeSettings()
{
QSettings settings("Moose Soft", "Clipper");
settings.beginGroup("MainWindow");
settings.setValue("size", size());
settings.setValue("pos", pos());
settings.endGroup();
}
void MainWindow::readSettings()
{
QSettings settings("Moose Soft", "Clipper");
settings.beginGroup("MainWindow");
resize(settings.value("size", QSize(400, 400)).toSize());
move(settings.value("pos", QPoint(200, 200)).toPoint());
settings.endGroup();
}
有關爲什麼最好調用QWidget :: resize()和QWidget :: move()而不是QWidget :: setGeometry()來恢復窗口幾何的討論,請參見窗口幾何:Window Geometry 。
必須從主窗口的構造函數和close事件處理程序中調用readSettings()和writeSettings()函數,如下所示:
MainWindow::MainWindow()
{
...
readSettings();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if (userReallyWantsToQuit()) {
writeSettings();
event->accept();
} else {
event->ignore();
}
}
有關使用QSettings的獨立示例,請參見“應用程序”示例。
同時從多個線程或進程訪問設置
QSettings是可重入的。 這意味着您可以同時在不同的線程中使用不同的QSettings對象。 即使QSettings對象引用磁盤上的相同文件(或系統註冊表中的相同條目),該保證仍然有效。 如果通過一個QSettings對象修改了設置,則該更改將立即在任何在同一位置運行且處於同一進程中的其他QSettings對象中可見。
如果滿足某些條件,可以從不同的進程(可以是同時運行的應用程序的不同實例,也可以是不同的應用程序)安全地使用QSettings來讀寫相同的系統位置。 對於QSettings :: IniFormat,它使用諮詢文件鎖定和智能合併算法來確保數據完整性。 工作的條件是可寫配置文件必須是常規文件,並且必須位於當前用戶可以在其中創建新的臨時文件的目錄中。如果不是這種情況,則必須使用setAtomicSyncRequired() 關閉安全裝置。
請注意,sync()導入其他進程所做的更改(除了從此QSettings中寫入更改之外)。
平臺特定說明
應用程序設置的存儲位置
如“後備機制”部分所述,QSettings會將應用程序的設置最多存儲在四個位置,具體取決於設置是用戶特定的還是系統範圍的,以及設置是特定於應用程序的還是組織範圍的。 爲了簡單起見,我們假設該組織稱爲MySoft,而該應用程序稱爲Star Runner。
在Unix系統上,如果文件格式爲NativeFormat,則默認使用以下文件:
$HOME/.config/MySoft/Star Runner.conf
(Qt for Embedded Linux:$HOME/Settings/MySoft/Star Runner.conf
)$HOME/.config/MySoft.conf
(Qt for Embedded Linux:$HOME/Settings/MySoft.conf
)- for each directory <dir> in $XDG_CONFIG_DIRS:
<dir>/MySoft/Star Runner.conf
- for each directory <dir> in $XDG_CONFIG_DIRS:
<dir>/MySoft.conf
注意:如果未設置XDG_CONFIG_DIRS,則使用/ etc / xdg的默認值。
在macOS版本10.2和10.3上,默認情況下使用以下文件:
$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”。
如果文件格式爲IniFormat,則在Unix,macOS和iOS上使用以下文件:
$HOME/.config/MySoft/Star Runner.ini
(Qt for Embedded Linux:$HOME/Settings/MySoft/Star Runner.ini
)$HOME/.config/MySoft.ini
(Qt for Embedded Linux:$HOME/Settings/MySoft.ini
)- for each directory <dir> in $XDG_CONFIG_DIRS:
<dir>/MySoft/Star Runner.ini
- for each directory <dir> in $XDG_CONFIG_DIRS:
<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_爲前綴的標識符是特殊項目ID列表,將傳遞給Win32 API函數SHGetKnownFolderPath()以獲得相應的路徑。
FOLDERID_RoamingAppData通常指向C:\ Users \ User Name \ AppData \ Roaming,也由環境變量%APPDATA%顯示。
FOLDERID_ProgramData通常指向C:\ ProgramData。
如果文件格式爲IniFormat,則在應用程序的主目錄中爲“ Settings / MySoft / Star Runner.ini”。
.ini和.conf文件的路徑可以使用setPath()進行更改。 在Unix,macOS和iOS上,用戶可以通過設置XDG_CONFIG_HOME環境變量來覆蓋它們。 有關詳細信息,請參見setPath()。
直接訪問INI和.plist文件
有時您確實想訪問存儲在特定文件或註冊表路徑中的設置。 在所有平臺上,如果要直接讀取INI文件,則可以使用QSettings構造函數,該構造函數以文件名作爲第一個參數,並傳遞QSettings :: IniFormat作爲第二個參數。 例如:
QSettings settings("/home/petra/misc/myapp.ini",
QSettings::IniFormat);
然後,您可以使用QSettings對象讀取和寫入文件中的設置。
在macOS和iOS上,您可以通過傳遞QSettings :: NativeFormat作爲第二個參數來訪問屬性列表.plist文件。 例如:
QSettings settings("/Users/petra/misc/myapp.plist",
QSettings::NativeFormat);
直接訪問Windows註冊表
在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上訪問通用註冊表設置
在Windows上,鍵可能同時具有值和子鍵。 通過使用“默認”或“”可以訪問其默認值。 代替子項:
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嘗試理順不同支持平臺之間的差異,但在移植應用程序時仍應注意一些差異:
- Windows系統註冊表具有以下限制:子項不能超過255個字符,條目的值不能超過16,383個字符,並且鍵的所有值都不能超過65,535個字符。解決這些限制的一種方法是使用IniFormat而不是NativeFormat存儲設置。
- 在Windows上,當使用Windows系統註冊表時,QSettings不會保留該值的原始類型。因此,設置新值時,值的類型可能會更改。例如,類型爲REG_EXPAND_SZ的值將更改爲REG_SZ。
- 在macOS和iOS上,allKeys()將爲適用於所有應用程序的全局設置返回一些額外的鍵。可以使用value()讀取這些鍵,但不能更改它們,只能對其進行陰影處理。調用setFallbacksEnabled(false)將隱藏這些全局設置。
- 在macOS和iOS上,QSettings使用的CFPreferences API需要Internet域名而不是組織名稱。爲了提供統一的API,QSettings會從組織名稱中得出僞造的域名(除非組織名稱已經是域名,例如OpenOffice.org)。該算法在公司名稱後附加“ .com”,並用連字符替換空格和其他非法字符。如果要指定其他域名,請在main()函數中調用QCoreApplication :: setOrganizationDomain(),QCoreApplication :: setOrganizationName()和QCoreApplication :: setApplicationName(),然後使用默認的QSettings構造函數。另一種解決方案是使用預處理器指令,例如:
#ifdef Q_OS_MAC
QSettings settings("grenoullelogique.fr", "Squash");
#else
QSettings settings("Grenoulle Logique", "Squash");
#endif
- 在macOS上,訪問不屬於當前用戶(即SystemScope)的設置的權限已隨10.7(Lion)更改。 在該版本之前,具有管理員權限的用戶可以訪問這些權限。 對於10.7和10.8(Mountain Lion),只有root可以。 但是,10.9(Mavericks)再次更改了該規則,但僅適用於本機格式(plist文件)。
另請參見QVariant,QSessionManager,設置編輯器示例和應用程序示例。
成員類型文檔
枚舉QSettings :: Format
此枚舉類型指定QSettings使用的存儲格式。
Constant | Value | Description |
---|---|---|
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::InvalidFormat |
16 |
registerFormat()返回的特殊值。 |
在Unix上,NativeFormat和IniFormat的含義相同,不同之處在於文件擴展名不同(.conf用於NativeFormat,.ini用於IniFormat)。
INI文件格式是Qt在所有平臺上都支持的Windows文件格式。 在沒有INI標準的情況下,我們嘗試遵循Microsoft的操作,但以下情況除外:
-
如果您存儲QVariant無法轉換爲QString的類型(例如QPoint,QRect和QSize),則Qt使用基於@的語法對類型進行編碼。 例如:
pos = @Point(100 100)
爲了最大程度地減少兼容性問題,任何未出現在值的第一個位置或其後沒有Qt類型(點,矩形,大小等)的@均被視爲普通字符。
-
儘管反斜槓是INI文件中的特殊字符,但是大多數Windows應用程序都不會在文件路徑中轉義反斜槓(\):
windir = C:\Windows
QSettings始終將反斜槓視爲特殊字符,並且不提供用於讀取或寫入此類條目的API。
- INI文件格式對密鑰的語法有嚴格的限制。 Qt通過使用%作爲鍵中的轉義字符來解決此問題。 另外,如果您保存一個頂級設置(其中沒有斜槓的鍵,例如“ someKey”),它將顯示在INI文件的“常規”部分中。 爲避免覆蓋其他鍵,如果使用諸如“ General / someKey”之類的鍵進行保存,則該鍵將位於“%General”部分,而不是“ General”部分。
- 遵循我們應該在接受的內容上保持自由,在生成的內容上保持保守的理念,QSettings將接受Latin-1編碼的INI文件,但生成純ASCII文件,其中非ASCII值使用標準INI轉義序列進行編碼。 爲了使INI文件更具可讀性(但兼容性可能較低),請調用setIniCodec()。
另請參見registerFormat()和setPath()。
typedef QSettings::ReadFunc
Typedef指向具有以下簽名的函數的指針:
bool myReadFunc(QIODevice &device, QSettings::SettingsMap &map);
ReadFunc在registerFormat()中用作指向讀取一組鍵/值對的函數的指針。 ReadFunc應該一次性讀取所有選項,並返回SettingsMap容器中的所有設置,該容器最初爲空。
另請參見WriteFunc和registerFormat()。
enum QSettings::Scope
該枚舉指定設置是用戶特定的還是由同一系統的所有用戶共享的。
Constant | Value | Description |
---|---|---|
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. |
另請參見setPath()。
typedef QSettings::SettingsMap
Typedef for QMap<QString, QVariant>.
另請參見registerFormat()。
enum QSettings::Status
可以使用以下狀態值:
Constant | Value | Description |
---|---|---|
QSettings::NoError |
0 |
沒有發生錯誤。 |
QSettings::AccessError |
1 |
發生訪問錯誤(例如,嘗試寫入只讀文件)。 |
QSettings::FormatError |
2 |
發生格式錯誤(例如,加載格式錯誤的INI文件)。 |
另請參見status()。
typedef QSettings::WriteFunc
Typedef指向具有以下簽名的函數的指針:
bool myWriteFunc(QIODevice &device, const QSettings::SettingsMap &map);
WriteFunc在registerFormat()中用作指向寫入一組鍵/值對的函數的指針。 WriteFunc僅被調用一次,因此您需要一次性輸出設置。
另請參見ReadFunc和registerFormat()。
成員函數文檔