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 资源集文件中对前缀的要求不是必需的。