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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

QSetting

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

QSetting是一個平臺無關的可以設置和讀取應用程序設置的類

用戶可能希望應用程序記住自己應用程序的設置,windows記錄在注冊表中,mac中記錄在xml中,在unix中,缺乏標準,所以很多都記錄在.ini文本文件中

QSetting的API都是基于QVariant的,允許保存很多類型的數據,例如QString,QRect,和QImage

基本用法:

當創建一個QSetting對象時候,應該把公司或組織,還有應用程序的名字傳遞給構造函數,例如,如果應用程序叫做Star Runner,公司叫做MySoft,那么應該像下面這樣構造對象

QSetting settings(“MySoft”,”Star Runner”);

QSetting的對象可以再堆或者棧上創建,構造和析構都非常快

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

QCoreApplication::setOrganizationName("MySoft");

???? QCoreApplication::setOrganizationDomain("mysoft.com");

??? QCoreApplication::setApplicationName("Star Runner");

???? ...

???? QSettings settings;

這里我們也指定了組織的網絡域名,使用QCoreApplication::setOrganizationDomain()

QSetting有鍵和值組成,使用QString指定鍵key的名字,使用QVariant來存儲和key相關聯的值,設定key,使用setValue(),例如

Setting.setValue(“editor/warpMargin”,68);

如果已經存在了同名的key,那么新的值會覆蓋原來的值

獲取setting的值使用value()函數

Intmargin=setting.value(“editor/warpMargin”).toInt();

如果沒有指定的key,那么value()會返回一個Null QVariant,也可以為value()指定一個缺省的值,如下面

Intmargin=setting.value(“editor/warpMargin,80).toInt();

缺省值就是80,value()返回的值是一個QVariant,把他轉換成int類型

QVariant和GUI類型

因為QVariant是QtCore庫的一部分,不能提供一個方便的函數轉換成QColor,QImage和QPixmap,因為這些是QtGui的一部分,換句話說,沒有toColor(),toImage(),toPixmap()等方法,但是我們可以使用qVariantValue()模板函數或者QVariant::value<templateT>來轉換,他們是等價的,例如

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

相反的轉換過程是QVariant自動支持的,包括GUI相關類型,例如

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

QSetting語法

無論windows還是unix,使用“/”作為分隔符,而不是“\”,如果在一個地方指定了“text fonts”,就不要再其他地方指定“Text Fonts”,例如

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();

效果和上面的一樣

除了group之外,QSetting也支持array概念,詳見beginReadArray()和beginWriteArray

如果有很多東西需要記錄在setting中,可以使用arrays更簡單一些,例如,你想保存一個變長的list,list中保存用戶的name和password,可以用下面的代碼

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

其中size是自動偵測到的長度

要想把他們讀取出來,可以使用如下的方法

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();

例子,? 保存GUI應用程序的狀態

在關閉應用程序時候保存應用程序窗口的大小和位置,在再次打開應用程序時候,讀取出來

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()要更好

在構造函數中調用readSetting(),在關閉窗口事件中調用writeSettings()

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

在多線程和多進程中使用QSetting

QSetting是可重入的,意味著可以在不同的線程中使用不同的QSetting對象,這保證即便多個QSetting對象同時操作同一個文件或者磁盤,如果其中一個對象修改了文件或者注冊表,同一個進程中其他操作同一個位置的QSetting對象能夠檢測到,并且不會讀取到臟數據。

在不同的進程中使用QSetting來讀寫同一個setting文件是安全的,它使用文件鎖和智能合并算法來保證數據的完整,在sync()調用之前,這個進程中的修改在另一個進程中是不可見的, QSetting::sync()的作用是將那些未保存的修改永久寫進存儲中,并且在其他進程中重新載入這些修改的設置,這個函數被QSetting的析構函數自動調用,也被事件循環定期調用,一般情況下不需要手動調用。

應用程序settings保存的位置

這里使用MySoft作為組織名,使用Star Runner作為應用程序名

在unix系統上,如果文件格式是NativeFormat,默認使用下面的文件

1 、$HOME/.config/MySoft/StarRunner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)

2、$HOME/.config/MySoft.conf(Qt for Embedded Linux: $HOME/Settings/MySoft.conf)

3、/etc/xdg/MySoft/StarRunner.conf

4、/etc/xdg/MySoft.conf

Mac os x上,默認使用下面的文件

  • $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
  • HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
  • HKEY_LOCAL_MACHINE\Software\MySoft
  • 在windows上,32位程序運行在WOW64模式下,setting被存儲在 HKEY_LOCAL_MACHINE\Software\WOW6432node.上

    如果是使用IniFormat,存儲位置如下

    Mac OS X上

  • $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\User Name\ApplicationData;

    %COMMON_APPDATA% 通常是C:\Documents and Settings\All Users\Application Data

    .ini和.conf文件的路徑可以使用setPath()來修改,在Mac OS X上,可以使用環境變量XDG_CONFIG_HOME

    直接讀取INI和.plist文件

    在所有平臺上,如果想直接讀取ini文件,可以在QSetting的構造函數中,將ini文件的名和QSetting::IniFormat作為參數,如下

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

    然后可以使用settings對象來讀寫這些設置

    在Mac OS X上,讀取XML基礎文件.plist通過傳遞參數QSetting::NativaFormat作為第二個參數,例如

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

    直接讀取Windows注冊表

    通過傳遞給構造函數第二個參數QSetting::NativaFormat,第一個參數是注冊表的鍵值位置,如下

    QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office", QSettings::NativeFormat);

    指定的路徑下的所有注冊表入口都可以通過QSetting像平常一樣讀寫,例如

    settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0);

    在windows上,一個鍵可能有一個值和一個子鍵,他默認的值可以通過“Dafault”和“.”獲取

    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”和“.”將會被當做一般子鍵看待處理。

    總結

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

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