日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Qt】QSettings介绍【转】

發布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】QSettings介绍【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

QSettings類提供了持久的跨平臺應用程序設置。

用戶通常期望應用程序記住它的設置(窗口大小、位置等)所有會話。這些信息通常存儲在Windows系統注冊表,OS X和iOS的屬性列表文件中。在Unix系統中,在缺乏標準的情況下,許多應用程序(包括KDE應用程序)使用INI文本文件。

QSettings圍繞這些抽象技術,使我們能夠以便攜的方式保存和恢復應用程序設置。它還支持自定義存儲格式。

QSettings API基于QVariant,可以保存很多基礎的類型,比如 QString、QRect、QImage等。

如果你需要的是一個非持久性的基于內存結構,可以考慮使用QMap<QString, QVariant>代替。

  • 簡介
  • 基本用法
  • QVariant和GUI類型
  • 重點說明
  • 后備機制
  • 存儲GUI程序狀態
  • 同時從多個線程或進程訪問QSettings
  • 特定平臺
    • 應用程序設置的存儲位置
    • 訪問INI和plist文件
    • 訪問Windows注冊表
    • 訪問Windows上常見的注冊表設置
  • 平臺限制

基本用法

當創建一個QSettings對象時,必須通過指定公司或組織名稱以及產品名稱,例如:公司名稱為:MySoft,產品名為:Star Runner,那么可以用下列方式來構造QSettings對象:

QSettings settings("MySoft", "Star Runner");

QSettings對象既可以創建在棧上,也可以創建在堆(即使用new)上,構建和銷毀也非常快。

如果你的應用程序在很多地方使用QSettings,則可以使用QCoreApplication::setOrganizationName() 和QCoreApplication::setApplicationName()來指定組織名和應用名,然后使用默認的QSettings構造函數:

QCoreApplication::setOrganizationName("MySoft"); QCoreApplication::setOrganizationDomain("mysoft.com"); QCoreApplication::setApplicationName("Star Runner"); ... QSettings settings;

QSettings可以存儲一系列設置。每個設置包括指定設置名稱(鍵)的一個字符串和一個與該鍵關聯的QVariant存儲數據。使用setValue()可以實現一個設置。例如:

settings.setValue("editor/wrapMargin", 68);

如果存在相同的設置鍵,現有的值將被新值覆蓋。為了提高效率,這些變化可能不會被立即保存到永久存儲(可以隨時調用sync()來提交更改)。

可以使用value()得到一個設置的值:

int margin = settings.value("editor/wrapMargin").toInt();

如果沒有指定鍵對應的設置,QSettings將會返回一個空QVariant(可轉換為整數0)。這時,我們可以通過另一個參數來指定默認值:

int margin = settings.value("editor/wrapMargin", 80).toInt();

  • contains() 判斷一個指定的鍵是否存在
  • remove() 刪除相關的鍵
  • allKeys() 獲取所有鍵
  • clear() 刪除所有鍵

void QSettings::beginGroup(const QString & 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();

這將生成三個設置值:

  • mainwindow/size
  • mainwindow/fullScreen
  • outputpanel/visible

int QSettings::beginReadArray(const QString & 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();

void QSettings::beginWriteArray(const QString & prefix, int size = -1)

為當前組添加前綴,并開始寫大小為size的數組。如果大小為-1(默認值),系統會自動根據索引的數目確定。

如果有許多出現一定的鍵集,可以使用數組實現更容易。例如,假設想要保存的用戶名和密碼的長度可變的列表。然后,你可以寫:

struct Login {QString userName;QString password; }; QList<Login> logins; ...QSettings settings; settings.beginWriteArray("logins"); for (int i = 0; i < logins.size(); ++i) {settings.setArrayIndex(i);settings.setValue("userName", list.at(i).userName);settings.setValue("password", list.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

enum QSettings::Format

這個枚舉類型指定QSettings所使用的存儲格式。

常量值描述
QSettings::NativeFormat0使用平臺最合適的存儲格式設置。在Windows中,使用系統注冊表;OS X和iOS中,使用的是CFPreferences API;在Unix中,使用的是INI格式的文本配置文件。
QSettings::IniFormat1存儲在INI文件中的設置。
QSettings::InvalidFormat16registerFormat()返回的值

Unix中,NativeFor??mat和IniFormat意思是一樣的,只是文件擴展名不同(NativeFor??mat為.conf,IniFormat 為.ini)。

enum QSettings::Scope

該枚舉指定設置是否用戶特定或同一系統的所有用戶共享。

常量值描述
QSettings::UserScope0在一個位置存儲特定于當前用戶的設置(例如,用戶的主目錄)。
QSettings::SystemScope1在一個全局位置存儲設置,以便在相同機器上所有用戶訪問同一組的設置。

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

為給定格式和范圍設置用來存儲的路徑。對于路徑而言,該格式可以是自定義格式。

下表總結了默認值:

平臺格式范圍路徑
WindowsIniFormat1.UserScope 2.SystemScope1.%APPDATA% 2.%COMMON_APPDATA%
UnixNativeFormat, IniFormat1.UserScope 2.SystemScope1.$HOME/.config 2./etc/xdg
Qt for Embedded LinuxNativeFormat, IniFormat1.UserScope 2.SystemScope1.$HOME/Settings 2./etc/xdg
OS X and iOSIniFormat1.UserScope 2.SystemScope1.$HOME/.config 2./etc/xdg

在Windows、OS X、iOS中設置NativeFormat沒有任何效果。

警告:此功能不會影響現有QSettings對象。

QVariant和GUI類型

因為QVariant是Qt Core模塊的一部分,它不能提供轉換功能到數據類型-例如:QColor、QImage、 QPixmap,因為這是Qt GUI的一部分。換句話說,QVariant中沒有toColor()、toImage()、toPixmap()等接口。

相反,可以使用QVariant::value()或qVariantValue()模板函數。 例如:

QSettings settings("MySoft", "Star Runner"); QColor color = settings.value("DataPump/bgcolor").value<QColor>();

逆轉換(例如,從QColor到QVariant)是自動通過QVariant支持的所有數據類型,包括GUI相關類型:

QSettings settings("MySoft", "Star Runner"); QColor color = palette().background().color(); settings.setValue("DataPump/bgcolor", color);

自定義類型注冊使用qRegisterMetaType()和qRegisterMetaTypeStreamOperators()可以使用QSettings存儲。

重點說明

設置中的鍵可以包含任何Unicode字符。Windows注冊表和INI文件使用對鍵不區分大小寫,而在OS X和iOS的CFPreferences API使用區分大小寫。為了避免可移植性問題,需要遵循這些簡單的規則:

  • 在相同情況下使用相同的鍵。例如:代碼中的一個位置使用”text fonts”,不要在別的地方使用”Text Fonts”。
  • 避免鍵名相同除了這種情況,例如:有一個名為”MainWindow”的鍵,不要試圖用”mainwindow”保存另一個鍵。
  • 不要使用斜線(’/’和’\’)作為鍵名,反斜杠字符用于分隔子鍵(見下文)。在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()設置,大多數功能的行為變化,組可以遞歸地設置。

    后備機制

    假設你用組織名MySoft、應用名Star Runner創建了一個QSettings對象,當查看一個值時,依次搜索四個地方:

  • 一個供Star Runner應用程序的用戶特定位置
  • 一個供MySoft所有應用程序的用戶特定位置
  • 一個供Star Runner應用程序的系統范圍位置
  • 一個供MySoft所有應用程序的系統范圍位置
  • 如果一個鍵不能在第一位置被找到時,繼續在第二的位置搜索,依此類推。這確保能夠存儲系統范圍或組織范圍內的設置,并在每個用戶或每個應用程序覆蓋它們,使用setFallbacksEnabled(false)可以關閉這一機制。

    雖然可以讀取來自所有四個位置的鍵,僅第一個文件(用戶特定的應用程序)用于寫入訪問。要寫入任何其他文件,省去了程序名和指定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”是指讀操作時被占用當做后備。

    Locationsobj1obj2obj3obj4
    User, ApplicationX???
    User, OrganizationoX??
    System, Applicationo?X?
    System, OrganizationoooX

    這種機制的優點在于它可以在Qt支持的所有平臺運行,它仍然給我們一個很大的靈活性,無需指定任何文件名或注冊表路徑。

    如果想在所有平臺上不使用原生API來使用 INI文件,可以通過 QSettings::IniFormat格式作為QSettings構造函數的第一個參數,其次是范圍,組織名,以及應用名:

    QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MySoft", "Star Runner");

    可以參考:Settings Editor例子(可以體驗不同的設置-回退、打開、關閉)。

    存儲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(); }

    可以參考: Window Geometry。為什么調用QWidget::resize()和QWidget::move()更好,而不是QWidget::setGeometry()來恢復窗口的幾何形狀。

    必須在MainWindow構造函數和關閉事件處理程序中調用readSettings()和writeSettings()函數,如下:

    MainWindow::MainWindow() {...readSettings(); }void MainWindow::closeEvent(QCloseEvent *event) {if (userReallyWantsToQuit()) {writeSettings();event->accept();} else {event->ignore();} }

    可以參考自帶的Application程序示例使用QSettings例子。

    同時從多個線程或進程訪問QSettings

    QSettings是可重入的,意味著可以同時在不同的線程中使用不同的QSettings對象,這保證QSettings對象操作同一磁盤上的文件(或在系統注冊表中的相同條目)。如果通過QSettings對象修改了一個設置,那么對于操作在同一位置和存在相同的進程的其他QSettings對象來說,更改會立即可見。

    QSettings可以由不同的進程(其可以是應用程序同時運行的不同實例或完全不同的應用程序)安全地使用-在相同的系統位置上進行讀寫,它使用勸告式文件鎖和智能合并算法以確保數據的完整性,需要注意的是sync()由其他進程所做的更改。

    特定平臺

    應用程序設置的存儲位置

    如上所提到的,在后背機制部分,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)
  • /etc/xdg/MySoft/Star Runner.conf
  • /etc/xdg/MySoft.conf
  • 在Mac OS X版本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
  • 如果文件格式是IniFormat,,以下文件用于在Unix、Mac OS X,、和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)
  • /etc/xdg/MySoft/Star Runner.ini
  • /etc/xdg/MySoft.ini
  • 在Windows中,使用以下文件:

  • %APPDATA%\MySoft\Star Runner.ini
  • %APPDATA%\MySoft.ini
  • %COMMON_APPDATA%\MySoft\Star Runner.ini
  • %COMMON_APPDATA%\MySoft.ini
  • %APPDATA%路徑通常為:C:\Documents and Settings\All Users\Application Data
    %COMMONAPPDATA%路徑通常為:C:\Documents and Settings\All Users\Application Data。

    在黑莓手機只有一個文件。如果文件格式是IniFormat,這時”Settings/MySoft/Star Runner.ini”在應用程序的主目錄。

    對于在.ini和conf文件的路徑,可以使用的setPath()來改變。在Unix、Mac OS X、iOS中,用戶可以通過設置XDG_CONFIG_HOME環境變量替代他們。

    訪問INI和.plist文件

    有時候,想在一個特定的文件或注冊表路徑中訪問存儲設置。在所有平臺上,如果想直接讀取INI文件,可以使QSettings構造函數的第一個參數為文件名,第二個參數為QSettings::IniFormat。例如:

    QSettings settings("/home/petra/misc/myapp.ini", QSettings::IniFormat);

    然后,就可以對文件進行讀寫設置。
    在OS X和iOS中,可以通過指定第二個參數為QSettings::NativeFormat訪問屬性列表的.plist文件。例如:

    QSettings settings("/Users/petra/misc/myapp.plist", QSettings::NativeFormat);

    訪問Windows注冊表

    在Windows中,QSettings可以在系統注冊表訪問由QSettings寫入的設置(或設置支持的格式,如字符串數據)。通過使用一個注冊表路徑和QSettings::NativeFormat來構建一個QSettings對象。例如:

    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上,有可能存在一個鍵既有值又存在子鍵。其默認值是通過使用”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"

    平臺限制

    盡管QSettings試圖支持??不同平臺,但還存在著一些差異,我們應該知道,當移植應用程序:

    Windows系統注冊表有以下限制:一個子項不能超過255個字符,一個條目的值不得超過16,383個字符,一個鍵的所有值不得超過65,535個字符。要解決這些局限性的一種方法是使用IniFormat代替NativeFor??mat存儲設置。

    在OS X和iOS中,allKeys()將返回適用于所有應用程序的全局設置一些額外的鍵。這些鍵可以使用value()讀取,但不能改變,只能跟蹤。調用setFallbacksEnabled(false) 將隱藏這些全局設置。

    在OS X和iOS,使用QSettings的CFPreferences API預計互聯網域名而不是組織名。為了提供一個統一的API,QSettings源于該組織名提供一個假域??名(除非組織名已經是一個域名,如:OpenOffice.org)。該算法追加”.com”到公司名,并用連字符替換空格和其他非法字符。如果你想指定不同的域名,在main()函數中調用QCoreApplication::setOrganizationDomain()、QCoreApplication::setOrganizationName()、QCoreApplication::setApplicationName(),然后使用默認的QSettings構造函數。
    另一種解決方案是使用預處理指令,例如:

    #ifdef Q_OS_MACQSettings settings("grenoullelogique.fr", "Squash"); #elseQSettings settings("Grenoulle Logique", "Squash"); #endif
    原文作者:一去丶二三里 作者博客:去作者博客空間 ?

    總結

    以上是生活随笔為你收集整理的【Qt】QSettings介绍【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。