## 8.6 Qt4 資源系統專題
Qt4 資源系統是與平臺無關的,它被用來存儲應用程序可執行文件運行時使用的二進制 文件(比如圖標文件、翻譯文件等)。它也是 Qt 的核心機制之一。當你的應用程序總是使 用一些特定的文件集合時,它會非常有用,并且能夠保證文件不易丟失。
Qt4 資源系統的運轉需要 qmake、rcc((Qt's resource compiler)以及 QFile 的緊密 配合。
### 8.6.1 Qt 資源系統的改進
Qt4 的資源系統取代了 Qt3 的 qembed 工具和圖片集(image collection)機制。 仍以我們的主窗口程序為例,如果采用 Qt3 的圖片集機制,那么需要將下述代碼加入到工程文件 mainwindow.pro 中:
```
IMAGES = images/icon.png \
images/open.png \
......
images/find.png \ images/gotocell.png \
images/new.png \
```
而使用 Qt4 的資源系統機制的話,只需要在 mainwindow.pro 中加入一條代碼:
```
RESOURCE = mainwindow.qrc
```
從中我們可以看出,Qt3 的圖片集機制是把資源文件的分布情況羅列出來,逐條的寫在 工程文件.pro 中,當程序中經常用到的資源文件數量非常多時,書寫工程文件將是一件頗費力氣而且乏味的工作,而且這樣也會導致 .pro 文件條理不清晰,維護困難,容易出錯。
### 8.6.2 Qt4 資源集文件
Qt4 在 Qt3 的基礎上做了改進。重新定義了一個 Qt 資源集(Resource Collection Files)文件,即.qrc 文件,它是一個基于標準 xml 格式的文本文件,我們在程序中所用到 的資源文件就被有規律的嵌入到它的標簽中,條理非常清晰,易于閱讀和維護。 Qt4 的 qmake 能夠識別這個資源集文件,并且能夠根據它的描述去相應的目錄下定位具體的資源。
### 8.6.3 資源文件的使用方法
在構造函數的最后部分,把窗口的圖標設置為 icon.png,它是一個 PNG 格式的文件。 Qt 支持很多圖像格式,包括 BMP、GIF、JPEG、PNG、PNM、SVG、TIFF、XBM 和 XPM。調用 QWidget::setWindowsIcon()函數可以設置顯示在窗口左上角的圖標。遺憾的是,還沒有一 種與平臺無關的可在桌面上顯示應用程序圖標的設置方法。
圖形用戶界面(GUI)應用程序通常會使用很多圖片。為應用程序提供圖片的方法有多 種,以下是最為常用的一些方法:
1\. 把圖片保存到文件中,并且在程序運行時載入它們。
2\. 把 XPM 文件包含在源代碼中。(這一方法之所以可行,是因為 XPM 文件也是有效的 C++文件。)
3\. 使用 Qt 的資源機制(Resource Mechanism)。
這里,我們使用了 Qt 的資源機制法,因為它比運行時載入文件的方法更為方便,并且 該方法適用于所支持的任意文件格式。我們將選中的圖片存放在源代碼樹中名為 images 的 子目錄下。
為了利用 Qt 的資源系統,必須創建一個資源文件( Resource File),并且在識別該 資源文件的.pro 工程文件中添加一行代碼。在這個例子中,已經將資源文件命名為 xxx.qrc,因此只需在.pro 文件中添加如下一行代碼:
```
RESOURCE = xxx.qrc
```
資源文件自身使用了一種簡單的 xml 文件格式。這里給出的是從已經使用的資源文件 中摘錄的部分內容:
```
<RCC>
<qresource>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
</qresource>
</RCC>
<file>images/paste.png</file>
<file>images/save.png</file>
```
所有資源文件都會被編譯到應用程序的可執行文件中,因此并不會弄丟它們。當引用 這些資源時,需要使用帶路徑前綴 :/(冒號斜線)的形式,這就是為什么會將圖標文件表示成:/images/icon.png 的形式。資源可以使任意類型的文件(并非只是一些圖像),并且可以在 Qt 需要文件名的大多數地方使用它們。
通過 Qt 資源編輯器 rcc,可以將資源轉換為 C++代碼。還可以通過把下面一行代碼加 入到.pro 文件中來告訴 qmake 包括專門的規則以運行 rcc。
```
RESOURCE = myresourcefile.qrc
```
myresourcefile.qrc 文件是一個 XML 文件,它列出了所有嵌入到可執行文件中的文 件。
假設我們正在編寫一個保持聯系細節的應用程序。考慮到用戶使用的方便性,我們想 在最后的可執行文件中嵌入國際撥號代碼。如果文件在應用程序所建目錄的 datafiles 目 錄下,那么資源文件將會如下所示:
```
<RCC>
<qresource>
<file>datafiles/phone-codes.dat</file>
</qresource>
</RCC>
```
在應用程序中,資源是通過:/路徑前綴識別的。在這個例子中,撥號代碼文件的路徑 為:/datafiles/phone-codes.dat,它可以像其他任何文件一樣通過 QFile 讀取。
在可執行文件中的嵌入數據具有不易丟失的優點,而且也有利于創建真正獨立的可執 行文件(如果也采用了靜態鏈接的話)。它的兩個缺點是:第一,如果需要改變嵌入數據, 則整個可執行文件都要跟著替換;第二,由于必須容納被嵌入的數據,可執行文件本身將變 得比較大。

圖 8-23 Qt 資源的編譯
Qt 資源系統所具備并提供的功能遠遠不止我們所介紹的這些,它還包括對文件名別名(Alias)的支持和本地化(Locale)的支持。如果你對此感興趣,請在 Qt Assistant 中 查閱“The Qt Resource System”一節中的內容。
目前,Qt4 資源系統總是將資源文件數據直接存儲在應用程序的可執行文件中,這確實 導致該文件體積偏大,這也是目前 Qt4 被人們所指摘的幾個主要問題之一。眾所周知, Windows 以及 Mac OS X 系統都提供了對資源的原生支持。在 Qt 的后續版本中,有望對這一 情況進行適應性修改。
### 8.6.4 資源瀏覽器(Resource Browser)的使用
資源瀏覽器是 Qt Designer 的常用組件之一。在使用 Qt Designer 創建的每一個界面 布局都可以擁有獨立的資源集文件( .qrc 文件)。
資源瀏覽器默認情況下已經打開并位于 Qt Designer 的右下角,如圖 8-24 所示。

圖 8-24 資源瀏覽器
在資源瀏覽器內,可以打開一個已經存在的資源集文件或者是創建新的資源集文件。 可以通過點擊快捷按鈕來編輯資源。表 8-4 列舉了快捷按鈕的功用。
表 8-4 資源瀏覽器快捷按鈕的功用
| 圖標 | 功用 |
| --- | --- |
|  | 編輯資源文件 |
|  | 重新載入資源文件 |
載入資源集文件后,可以創建或者是刪除其中包含的資源文件。表 8-5 列舉了【編輯 資源】對話框中各個功能按鈕的功用。
表 8-5 編輯資源對話框中功能按鈕的功用
| 圖標 | 功用 |
| --- | --- |
| | 增加前綴 |
| | 增加資源文件 |
| | 移除資源文件或者前綴 |
| | 新建資源文件 |
| | 打開資源文件 |
| | 移除資源文件 |
注意,添加到資源集文件內的資源文件必須與資源集文件在同一個文件夾內或者是位 于它的子菜單下面。
圖 8-25 顯示的是一個添加資源集文件的范例。

圖 8-25 編輯資源集文件
注意,Qt 資源集文件中對前綴的要求不是必需的。
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區