QSettings 类【官翻】
文章目錄
- 詳述
- 基本用法
- QVariant和GUI類型
- Section 和 Key 的語法
- 后備機制
- 恢復(fù)GUI應(yīng)用程序的狀態(tài)
- 同時從多個線程或進程訪問設(shè)置
- 特定于平臺的說明
- 應(yīng)用程序設(shè)置的存儲位置
- 直接訪問INI和.plist文件
- 直接訪問Windows注冊表
- 在Windows上訪問通用注冊表設(shè)置
- 平臺限制
- 公共類型
- 公共函數(shù)
- 靜態(tài)公共函數(shù)
- 重新實現(xiàn)的受保護的函數(shù)
QSettings 類
QSettings類提供與平臺無關(guān)的持久性應(yīng)用程序設(shè)置。
| qmake: | QT += core |
| Since: | |
| Inherits: | QObject |
| Inherited By: |
詳述
用戶通常希望應(yīng)用程序在會話中記住它的設(shè)置(窗口大小和位置、選項等)。這些信息通常存儲在Windows的系統(tǒng)注冊表中,macOS和iOS的屬性列表文件中。在Unix系統(tǒng)上,由于缺乏標準,許多應(yīng)用程序(包括KDE應(yīng)用程序)都使用INI文本文件。
QSettings是圍繞這些技術(shù)的抽象,使您能夠以可移植的方式保存和恢復(fù)應(yīng)用程序設(shè)置。 它還支持自定義存儲格式。
QSettings的API基于QVariant,使您可以省力地保存大多數(shù)基于值的類型,例如QString,QRect和QImage。
如果您需要的只是一個基于非持久性內(nèi)存的結(jié)構(gòu),請考慮改用QMap <QString,QVariant>。
基本用法
在創(chuàng)建QSettings對象時,必須傳遞公司或組織的名稱以及應(yīng)用程序的名稱。例如,如果您的產(chǎn)品名為Star Runner,您的公司名為MySoft,您將構(gòu)建QSettings對象如下:
QSettings settings("MySoft", "Star Runner");QSettings對象既可以在棧上創(chuàng)建,也可以在堆上創(chuàng)建(即使用new)。構(gòu)造和銷毀QSettings對象非常快。
如果您在應(yīng)用程序的許多地方使用QSettings,您可能想要使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()來指定組織名稱和應(yīng)用程序名稱,然后使用默認的QSettings構(gòu)造函數(shù):
QCoreApplication::setOrganizationName("MySoft");QCoreApplication::setOrganizationDomain("mysoft.com");QCoreApplication::setApplicationName("Star Runner");...QSettings settings;(在這里,我們還指定了該組織的互聯(lián)網(wǎng)域。當設(shè)置Internet域名時,在macOS和iOS上使用它而不是組織名稱,因為macOS和iOS應(yīng)用程序通常使用Internet域名來標識自己。如果沒有設(shè)置域名,則從該組織名稱派生出一個假域名。有關(guān)詳細信息,請參閱下面特定于平臺的說明。)
QSettings存儲設(shè)置。每個設(shè)置由一個指定設(shè)置名稱(鍵)的QString和一個存儲與鍵關(guān)聯(lián)的數(shù)據(jù)的QVariant組成。要編寫設(shè)置,使用setValue()。例如:
settings.setValue("editor/wrapMargin", 68);如果已經(jīng)存在具有相同鍵的設(shè)置,則現(xiàn)有值將被新值覆蓋。為了提高效率,更改不能立即保存到永久存儲中。(您總是可以調(diào)用sync()來提交您的更改。)
你可以使用value()返回設(shè)置的值:
int margin = settings.value("editor/wrapMargin").toInt();如果沒有指定名稱的設(shè)置,QSettings將返回一個空的QVariant(可以轉(zhuǎn)換為整數(shù)0)。
int margin = settings.value("editor/wrapMargin", 80).toInt();- 要測試給定的鍵是否存在,調(diào)用contains()。
- 要移除與鍵相關(guān)聯(lián)的設(shè)置,調(diào)用remove()。
- 要獲得所有鍵的列表,可以調(diào)用allKeys()。
- 要刪除所有鍵,調(diào)用clear()。
QVariant和GUI類型
因為QVariant是Qt核心模塊的一部分,所以它不能提供對QColor、QImage和QPixmap等數(shù)據(jù)類型的轉(zhuǎn)換功能,這些數(shù)據(jù)類型都是Qt GUI的一部分。換句話說,QVariant中沒有toColor()、toImage()或toPixmap()函數(shù)。
相反,您可以使用QVariant::value()模板函數(shù)。例如:
QSettings settings("MySoft", "Star Runner");QColor color = settings.value("DataPump/bgcolor").value<QColor>();對于QVariant支持的所有數(shù)據(jù)類型,包括gui相關(guān)的類型,反向轉(zhuǎn)換(例如,從QColor到QVariant)都是自動的:
QSettings settings("MySoft", "Star Runner");QColor color = palette().background().color();settings.setValue("DataPump/bgcolor", color);使用qRegisterMetaType()和qregistermetatypestreamoperator()注冊的自定義類型可以使用QSettings存儲。
Section 和 Key 的語法
設(shè)置鍵可以包含任何Unicode字符。 Windows注冊表和INI文件使用不區(qū)分大小寫的鍵,而macOS和iOS上的CFPreferences API使用不區(qū)分大小寫的鍵。 為避免可移植性問題,請遵循以下簡單規(guī)則:
- 始終使用相同的大小寫引用相同的鍵。 例如,如果在代碼中的某個地方將鍵稱為“text fonts”,則不要在其他地方將其稱為“text fonts”。
- 避免使用除大小寫外相同的鍵名。 例如,如果您有一個名為 “MainWindow” 的鍵,請不要嘗試將另一個鍵另存為“ mainwindow”。
- 在節(jié)或鍵名中不要使用斜杠(“ /”和“ \”); 反斜杠字符用于分隔子鍵(請參見下文)。 在Windows上,QSettings將“ \”轉(zhuǎn)換為“ /”,從而使它們相同。
您可以使用’/'字符作為分隔符來形成分層鍵,類似于Unix文件路徑。 例如:
settings.setValue("mainwindow/size", win->size());settings.setValue("mainwindow/fullScreen", win->isFullScreen());settings.setValue("outputpanel/visible", panel->isVisible());如果要保存或還原具有相同前綴的許多設(shè)置,則可以使用beginGroup() 指定前綴,并在末尾調(diào)用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() 設(shè)置了一個組,則大多數(shù)函數(shù)的行為都會改變。 可以遞歸設(shè)置組。
除了組之外,QSettings還支持 “array” 概念。 有關(guān)詳細信息,請參見beginReadArray() 和beginWriteArray() 。
后備機制
假設(shè)您已經(jīng)創(chuàng)建了一個QSettings對象,組織名稱為MySoft,應(yīng)用程序名稱為Star Runner。當你查找一個值時,最多可以按此順序搜索四個位置:
(有關(guān)Qt支持的不同平臺上這些位置的信息,請參閱下面的平臺特定說明。)
如果在第一個位置無法找到一個鍵,則在第二個位置繼續(xù)搜索,依此類推。這使您能夠存儲系統(tǒng)范圍或組織范圍的設(shè)置,并在每個用戶或每個應(yīng)用程序的基礎(chǔ)上覆蓋它們。要關(guān)閉這個機制,調(diào)用setFallbacksEnabled(false)。
盡管來自所有四個位置的鍵都可用于讀取,但只有第一個文件(當前應(yīng)用程序的用戶特定位置)可用于寫入。要寫入任何其他文件,省略應(yīng)用程序名稱和/或指定QSettings::SystemScope(相對于默認的QSettings::UserScope)。
讓我們看一個例子:
QSettings obj1("MySoft", "Star Runner");QSettings obj2("MySoft");QSettings obj3(QSettings::SystemScope, "MySoft", "Star Runner");QSettings obj4(QSettings::SystemScope, "MySoft");下表總結(jié)了哪些QSettings對象訪問哪個位置。 “ X”表示該位置是與QSettings對象關(guān)聯(lián)的主要位置,并且用于讀取和寫入。 “ o”表示該位置在讀取時用作備用。
| 1. User, Application | X | |||
| 2. User, Organization | o | X | ||
| 3. System, Application | o | X | ||
| 4. System, Organization | o | o | o | X |
這種機制的優(yōu)點在于,它可以在Qt支持的所有平臺上運行,并且仍然為您提供了很大的靈活性,而無需您指定任何文件名或注冊表路徑。
如果要在所有平臺上使用INI文件而不是本機API,則可以將QSettings::IniFormat作為第一個參數(shù)傳遞給QSettings構(gòu)造函數(shù),然后是范圍,組織名稱和應(yīng)用程序名稱:
QSettings settings(QSettings::IniFormat, QSettings::UserScope,"MySoft", "Star Runner");請注意,從INI文件讀取設(shè)置時不會保留類型信息。 所有值將作為QString返回。
Settings Editor example 允許您嘗試不同的設(shè)置位置,并打開或關(guān)閉后背機制。
恢復(fù)GUI應(yīng)用程序的狀態(tài)
QSettings通常用于存儲GUI應(yīng)用程序的狀態(tài)。下面的示例演示了如何使用QSettings保存和恢復(fù)應(yīng)用程序主窗口的幾何圖形。
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();}有關(guān)為什么最好調(diào)用QWidget :: resize() 和QWidget :: move() 而不是QWidget :: setGeometry() 來恢復(fù)窗口幾何的討論,請參見窗口幾何。
必須從主窗口的構(gòu)造函數(shù)和close事件處理程序中調(diào)用readSettings() 和writeSettings() 函數(shù),如下所示:
MainWindow::MainWindow(){...readSettings();}void MainWindow::closeEvent(QCloseEvent *event){if (userReallyWantsToQuit()) {writeSettings();event->accept();} else {event->ignore();}}有關(guān)使用QSettings的獨立示例,請參見 “Application Example ” 示例。
同時從多個線程或進程訪問設(shè)置
QSettings是可重入的。這意味著您可以同時在不同的線程中使用不同的QSettings對象。即使QSettings對象引用磁盤上的相同文件(或系統(tǒng)注冊表中的相同條目),也可以保證這一點。如果通過一個QSettings對象修改了設(shè)置,則該更改將立即在任何在同一位置運行且處于同一進程中的其他QSettings對象中可見。
只要滿足某些條件,就可以從不同的進程(可以是同時運行的應(yīng)用程序的不同實例,也可以是不同的應(yīng)用程序)安全地使用QSettings來讀寫相同的系統(tǒng)位置。對于QSettings :: IniFormat,它使用咨詢文件鎖定和智能合并算法來確保數(shù)據(jù)完整性。工作的條件是可寫配置文件必須是常規(guī)文件,并且必須位于當前用戶可以在其中創(chuàng)建新的臨時文件的目錄中。如果不是這種情況,則必須使用setAtomicSyncRequired() 關(guān)閉安全裝置。
請注意,sync() 導(dǎo)入其他進程所做的更改( 除了從此QSettings寫入更改之外 )。
特定于平臺的說明
應(yīng)用程序設(shè)置的存儲位置
如“后備機制”部分所述,QSettings會將應(yīng)用程序的設(shè)置存儲在最多四個位置,具體取決于設(shè)置是用戶特定的還是系統(tǒng)范圍的,以及設(shè)置是特定于應(yīng)用程序的還是組織范圍的。 為簡單起見,我們假設(shè)該組織稱為MySoft,而該應(yīng)用程序稱為Star Runner。
在Unix系統(tǒng)上,如果文件格式為NativeFormat,則默認使用以下文件:
- $ HOME / .config / MySoft / Star Runner.conf(用于嵌入式Linux的Qt:$ HOME / Settings / MySoft / Star Runner.conf)
- $ HOME / .config / MySoft.conf(嵌入式Linux的Qt:?$HOME / Settings / MySoft.conf)
- 對于$ XDG_CONFIG_DIRS中的每個目錄< dir >:< dir> / MySoft / Star Runner.conf
- 對于$ XDG_CONFIG_DIRS中的每個目錄< dir>:< dir> /MySoft.conf
注意:如果未設(shè)置XDG_CONFIG_DIRS,則使用/ etc / xdg的默認值。
在macOS版本10.2和10.3上,默認情況下使用以下文件:
在Windows上,NativeFormat設(shè)置存儲在以下注冊表路徑中:
注意:在Windows上,對于以WOW64模式運行的32位程序,設(shè)置存儲在以下注冊表路徑中:
HKEY_LOCAL_MACHINE \ Software \ WOW6432node。
如果文件格式為NativeFormat,則在應(yīng)用程序的主目錄中為“ Settings / MySoft / Star Runner.conf”。
如果文件格式為IniFormat,則在Unix,macOS和iOS上使用以下文件:
注意:如果未設(shè)置XDG_CONFIG_DIRS,則使用/ etc / xdg的默認值。
在Windows上,使用以下文件:
以FOLDERID_為前綴的標識符是特殊項目ID列表,將傳遞給Win32 API函數(shù)SHGetKnownFolderPath() 以獲取相應(yīng)的路徑。
FOLDERID_ProgramData通常指向C:\ProgramData。
如果文件格式為IniFormat,則在應(yīng)用程序的主目錄中為“ Settings / MySoft / Star Runner.ini”。
配置文件.ini和.conf文件的路徑可以使用setPath() 進行更改。 在Unix,macOS和iOS上,用戶可以通過設(shè)置XDG_CONFIG_HOME環(huán)境變量來覆蓋它們。 有關(guān)詳細信息,請參見setPath() 。
直接訪問INI和.plist文件
有時您確實想訪問存儲在特定文件或注冊表路徑中的設(shè)置。 在所有平臺上,如果要直接讀取INI文件,則可以使用QSettings構(gòu)造函數(shù),該構(gòu)造函數(shù)以文件名作為第一個參數(shù),并傳遞QSettings :: IniFormat作為第二個參數(shù)。 例如:
QSettings settings("/home/petra/misc/myapp.ini",QSettings::IniFormat);然后,您可以使用QSettings對象讀取和寫入文件中的設(shè)置。
在macOS和iOS上,可以通過傳遞QSettings :: NativeFormat作為第二個參數(shù)來訪問屬性列表.plist文件。 例如:
QSettings settings("/Users/petra/misc/myapp.plist", QSettings::NativeFormat);直接訪問Windows注冊表
在Windows上,QSettings可讓您訪問系統(tǒng)注冊表中用QSettings編寫的設(shè)置(或受支持格式的設(shè)置,例如字符串數(shù)據(jù))。 這是通過構(gòu)造QSettings對象和注冊表中的路徑以及QSettings :: NativeFormat來完成的。
例如:
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office", QSettings::NativeFormat);可以照常通過QSettings對象讀取或?qū)懭氤霈F(xiàn)在指定路徑下的所有注冊表項(使用正斜杠而不是反斜杠)。 例如:
settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0);請注意,如上所述,QSettings使用反斜杠字符來分隔子項。 如此一來,您將無法讀取或?qū)懭氚备芑蚍葱备艿腤indows注冊表項。 如果需要,您應(yīng)該使用本機Windows API。
在Windows上訪問通用注冊表設(shè)置
在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”和"."將被視為常規(guī)子項。
平臺限制
雖然QSettings嘗試理順不同支持平臺之間的差異,但在移植應(yīng)用程序時仍應(yīng)注意一些差異:
-
Windows系統(tǒng)注冊表具有以下限制:子項不能超過255個字符,條目的值不能超過16,383個字符,并且鍵的所有值都不能超過65,535個字符。解決這些限制的一種方法是使用IniFormat而不是NativeFormat存儲設(shè)置。
-
在Windows上,當使用Windows系統(tǒng)注冊表時,QSettings不會保留該值的原始類型。因此,設(shè)置新值時,值的類型可能會更改。例如,類型為REG_EXPAND_SZ的值將更改為REG_SZ。
-
在macOS和iOS上,allKeys() 將為適用于所有應(yīng)用程序的全局設(shè)置返回一些額外的鍵??梢允褂胿alue() 讀取這些鍵,但不能更改它們,只能對其進行陰影處理。調(diào)用setFallbacksEnabled(false)將隱藏這些全局設(shè)置。
-
在macOS和iOS上,QSettings使用的CFPreferences API需要Internet域名而不是組織名稱。為了提供統(tǒng)一的API,QSettings會從組織名稱中得出偽造的域名(除非組織名稱已經(jīng)是域名,例如OpenOffice.org)。該算法在公司名稱后附加“ .com”,并用連字符替換空格和其他非法字符。如果要指定其他域名,請在main() 函數(shù)中調(diào)用QCoreApplication :: setOrganizationDomain() ,QCoreApplication :: setOrganizationName() 和QCoreApplication :: setApplicationName() ,然后使用默認的QSettings構(gòu)造函數(shù)。另一種解決方案是使用預(yù)處理器指令,例如:
#ifdef Q_OS_MACQSettings settings("grenoullelogique.fr", "Squash");#elseQSettings settings("Grenoulle Logique", "Squash");#endif -
在macOS上,不屬于當前用戶(即SystemScope)的訪問設(shè)置的權(quán)限已隨10.7(Lion)更改。 在該版本之前,具有管理員權(quán)限的用戶可以訪問這些權(quán)限。 對于10.7和10.8(Mountain Lion),只有root可以。 但是,10.9(Mavericks)再次更改了該規(guī)則,但僅適用于本機格式(plist文件)。
另請參見QVariant,QSessionManager,設(shè)置編輯器示例和應(yīng)用程序示例。
公共類型
QSettings使用的存儲格式。
公共函數(shù)
靜態(tài)公共函數(shù)
重新實現(xiàn)的受保護的函數(shù)
總結(jié)
以上是生活随笔為你收集整理的QSettings 类【官翻】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python输出十六进制大小写_Pyth
- 下一篇: 个人网站www.pixysoft.net