#(9):資源文件
上一章節中我們介紹了如何使用`QAction`添加動作。其中,我們使用`QIcon`加載了一張 png 圖片。那時候我們使用的是 Qt 資源文件。現在我們來仔細了解下 Qt 的資源系統。
Qt 資源系統是一個跨平臺的資源機制,用于將程序運行時所需要的資源以二進制的形式存儲于可執行文件內部。如果你的程序需要加載特定的資源(圖標、文本翻譯等),那么,將其放置在資源文件中,就再也不需要擔心這些文件的丟失。也就是說,如果你將資源以資源文件形式存儲,它是會編譯到可執行文件內部。
使用 Qt Creator 可以很方便地創建資源文件。我們可以在工程上點右鍵,選擇“添加新文件…”,可以在 Qt 分類下找到“Qt 資源文件”:
[](http://files.devbean.net/images/2012/08/qtc-qrc-create.png)
點擊“選擇…”按鈕,打開“新建 Qt 資源文件”對話框。在這里我們輸入資源文件的名字和路徑:
[](http://files.devbean.net/images/2012/08/qtc-qrc-name.png)
點擊下一步,選擇所需要的版本控制系統,然后直接選擇完成。我們可以在 Qt Creator 的左側文件列表中看到“資源文件”一項,也就是我們新創建的資源文件:
[](http://files.devbean.net/images/2012/08/qtc-qrc-ui.png)
右側的編輯區有個“添加”,我們首先需要添加前綴,比如我們將前綴取名為 images。然后選中這個前綴,繼續點擊添加文件,可以找到我們所需添加的文件。這里,我們選擇 document-open.png 文件。當我們完成操作之后,Qt Creator 應該是這樣子的:
[](http://files.devbean.net/images/2012/08/qtc-qrc-added.png)
接下來,我們還可以添加另外的前綴或者另外的文件。這取決于你的需要。當我們添加完成之后,我們可以像前面一章講解的那樣,通過使用 : 開頭的路徑來找到這個文件。比如,我們的前綴是 /images,文件是 document-open.png,那么就可以使用`:/images/document-open.png`找到這個文件。
這么做帶來的一個問題是,如果以后我們要更改文件名,比如將 docuemnt-open.png 改成 docopen.png,那么,所有使用了這個名字的路徑都需要修改。所以,更好的辦法是,我們給這個文件去一個“別名”,以后就以這個別名來引用這個文件。具體做法是,選中這個文件,添加別名信息:
[](http://files.devbean.net/images/2012/08/qtc-qrc-alias.png)
這樣,我們可以直接使用`:/images/doc-open`引用到這個資源,無需關心圖片的真實文件名。
如果仔細觀察,還會看到資源編輯窗口最下方有一個“語言”。這個可以對資源進行國際化。比如我們新建一個前綴,將語言設置為 fr,再添加一個文件 document-open-fr.png:
[](http://files.devbean.net/images/2012/08/qtc-qrc-lang.png)
我們可以使用`:/images/fr/doc-open`引用到 document-open-fr.png 這個文件。這個“語言”的作用是,如果 Qt 發現,本機的本地化信息是 fr 的話(`QLocale::system().name()`返回 fr_FR),則使用`:/images/fr/doc-open`這個圖片;如果不是,則默認使用`:/images/doc-open`這個。
如果我們使用文本編輯器打開 res.qrc 文件,就會看到一下內容:
~~~
<RCC>
<qresource prefix="/images">
<file alias="doc-open">document-open.png</file>
</qresource>
<qresource prefix="/images/fr" lang="fr">
<file alias="doc-open">document-open-fr.png</file>
</qresource>
</RCC>
~~~
我們可以對比一下,看看 Qt Creator 幫我們生成的是怎樣的 qrc 文件。當我們編譯工程之后,我們可以在構建目錄中找到 qrc_res.cpp 文件,這就是 Qt 將我們的資源編譯成了 C++ 代碼。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)