QSettings 操作注册表 与 ini 文件的优劣
0.注冊表和ini的優劣之處
ini文件最大好處就是 無污染
注冊表的最大好處就是 隱密!
總結:
(1)?注冊表 采用的是二進制形式登錄數據,INI 文件采用的則是簡單的文本形式登錄數據。
(2)?注冊表 支持子關鍵字,各級子關鍵字都有自己的“鍵值”;INI 文件中則支持小節以及小節中的設置行參數。
(3)?Registry 可以包括子鍵,而 INI 文件不支持小節的嵌套。
(4)?Registry 中的鍵值項還可以包含可執行代碼,而在INI文件中設置項只是簡單的字串。
(5)?在同一臺計算機上有多個用戶,Registry 可以存儲每個用戶的特性,而INI文件中卻不可能。
在功能上,注冊表與.INI文件相比,主要有以下3個特點:
(1)?注冊表允許對硬件、某些操作系統參數、應用程序和設備驅動程序進行跟蹤配置,這使得某些配置的改變(如“控制面板”中的選項等)可以在不重新啟動系統的情況下立即生效。
(2)?注冊表中登錄的硬件部分數據可以用來支持Windows?98的即插即用特性。當Windows?98檢測到機器上的各種設備時,就把有關數據保存到注冊表中。通常是在安裝時進行這種檢測的,但Windows?98啟動或原有配置改變時,也要進行檢測。如安裝一個新的硬件時,Windows?98將檢查注冊表,以便確定哪些資源已被占用,這樣就可以避免新設備與原有設備之間的資源沖突。
(3)?通過注冊表,管理人員和用戶可以在網絡上檢查系統的配置和設置,使得遠程管理得以實現。
注冊表的優勢
軟件占用內存:
注冊表不是一次全部都加載到內存中, 有些部分只有在要用時才會調入內存.
保密性:
根據微軟的推薦,用 注冊表 還是好些,因為你可以加上他的安全策略保護注冊表,因而也保證了你的程序相關數據的保密性,而用ini文件你又要自己定作加密算法了
注冊表主要是為了解決ini文件很難做到支持3維表格的問題,而且可以讓多個系統共享數據。
注冊表的劣勢
注冊表寫的數據多了不會占內存,但是會減慢 WINDOWS 的速度!
因為注冊表寫得多了,垃圾太多,數據龐大檢索速度必能要慢!
注冊表很容易留下垃圾,越弄越大。 - 在卸載程序時,不能完整地卸載,會留下痕跡
ini 文件的優勢
如果不涉及到復雜的多用戶,用ini我個人認為比較好。
軟件卸載時,不會留下痕跡
易讀、易復制
?
1. QT 幫助文檔中的簡介
QSettings類提供了持久的跨平臺應用程序設置。
用戶通常期望應用程序記住它的設置(窗口大小、位置等)所有會話。這些信息通常存儲在 Windows 系統注冊表,OS X和iOS的屬性列表文件中。在Unix系統中,在缺乏標準的情況下,許多應用程序(包括KDE應用程序)使用INI文本文件。
QSettings圍繞這些抽象技術,使我們能夠以便攜的方式保存和恢復應用程序設置。它還支持自定義存儲格式。
QSettings API基于QVariant,可以保存很多基礎的類型,比如 QString、QRect、QImage等。
如果你需要的是一個非持久性的基于內存結構,可以考慮使用QMap<QString, QVariant>代替
?
2. QSettings 兩種操作 注冊表 與 ini 文件
QSettings是 qt 提供的一個讀取配置文件的類,在 windows平臺,它提供了ini文件讀些,注冊表讀寫的功能。
使用 QSettings::Format 來區分
QSettings::Format 有兩種:
??? QSettings::NativeFormat -- 在windows平臺可以讀寫windows注冊表.
??? QSettings::IniFormat -- 可以讀寫ini格式的配置文件
在Unix/X11平臺下這兩個Format效果是一樣的。
【備注】:
在 windows 平臺, QSettings 默認是訪問注冊表,如:
// main.cpp QApplication app(argc, argv); app.setApplicationName("AppName"); app.setOrganizationName("Organ");//寫入 - 最終是寫到了,注冊表 \HKEY_CURRENT_USER\Software\Organ\AppName\Language 中 {QSettings settings;settings.beginGroup("Language");if (strLocal.isEmpty())settings.remove(QLatin1String("currentLanguage"));elsesettings.setValue(QLatin1String("currentLanguage"), strLocal);settings.endGroup();}// 讀取 - 從注冊表 \HKEY_CURRENT_USER\Software\Organ\AppName\Language 中讀取 {QSettings settings;settings.beginGroup(QLatin1String("Language"));QString str_lan = settings.value(QLatin1String("currentLanguage")).toString();settingsTranslation.endGroup(); }?
3. 用法
當創建一個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();
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
4.重點說明
設置中的鍵可以包含任何Unicode字符。Windows注冊表和INI文件使用對鍵不區分大小寫,而在OS X和iOS的CFPreferences API使用區分大小寫。為了避免可移植性問題,需要遵循這些簡單的規則:
可以使用’ / ‘字符作為分隔符形成分層鍵,類似于Unix文件路徑。例如:
settings.setValue("mainwindow/size", win->size()); settings.setValue("mainwindow/fullScreen", win->isFullScreen()); settings.setValue("outputpanel/visible", panel->isVisible());5. 同時從多個線程或進程訪問QSettings
QSettings是可重入的,意味著可以同時在不同的線程中使用不同的QSettings對象,這保證QSettings對象操作同一磁盤上的文件(或在系統注冊表中的相同條目)。如果通過QSettings對象修改了一個設置,那么對于操作在同一位置和存在相同的進程的其他QSettings對象來說,更改會立即可見。
QSettings可以由不同的進程(其可以是應用程序同時運行的不同實例或完全不同的應用程序)安全地使用-在相同的系統位置上進行讀寫,它使用勸告式文件鎖和智能合并算法以確保數據的完整性,需要注意的是sync()由其他進程所做的更改。
?
訪問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 操作注册表 与 ini 文件的优劣的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言平均绩点_C语言 - ACM题目:
- 下一篇: 金山新剑网3白金新手卡,新剑网3钻…