Qt 之生成 Window 资源文件(.rc 文件)

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

qmake 可以随意地自动生成一个适当填充的 Windows 资源文件。本节主要讲解如何用 qmake 处理一个 Windows 资源文件,并将其链接到一个可执行应用程序(EXE)或动态链接库(DLL)。

详细说明

一个链接的 Windows 资源文件包含许多元素,可以由其 EXE 或者 DLL 来访问。然而,Qt 资源系统应当以独立于平台的方式访问链接资源。但在链接的 Windows 资源文件中,有一些标准元素只能由 Windows 自身访问。例如,在 Windows 资源管理器中,文件属性的“详细信息”需要由资源元素填充。此外,EXE 的程序图标也需要从这些元素中读取。所以,对于一个由 Qt 创建的 Windows EXE 或 DLL 来说,要同时使用这两项技术,比较好的实践方法是:通过 Qt 资源系统链接独立于平台的资源,并通过一个 Windows 资源文件添加 Windows 的特定资源。

通常情况下,一个资源定义脚本(.rc 文件)被编译成一个 Windows 资源文件。在微软的工具链内部,RC 工具生成一个 .res 文件,该文件可以被微软链接器链接到一个 EXE 或 DLL;MinGW 工具链使用 windres 工具生成一个 .o 文件,该文件可以被 MinGW 链接器链接到一个 EXE 或 DLL。

生成 .rc 文件

通过设置系统变量 VERSIONRC_ICONS (至少一个),qmake 会自动生成 .rc 文件。

VERSION 为例,在 pro 中添加版本信息:

VERSION = 4.0.2.666

执行 qmake,这时,会在 build 目录下生成一个名为 MyApp_resource.rc 的文件,生成的 .rc 文件会被自动编译和链接。

这里写图片描述

执行 Build(构建),会生成对应的 MyApp_resource.res 文件(已编译的资源脚本)。

可以看到,生成 .rc 文件的同时,会适当的填充元素,而这些元素由系统变量 QMAKE_TARGET_COMPANYQMAKE_TARGET_DESCRIPTIONQMAKE_TARGET_COPYRIGHTQMAKE_TARGET_PRODUCTRC_CODEPAGERC_ICONSRC_LANG、和 VERSION 所决定。

如果这些元素不满足需要,qmake 还提供了两个系统变量:RC_FILERES_FILE,他们直接指向一个外部创建的 .rc 或 .res 文件。通过设置其中的一个变量,指定的文件就可以被链接到 EXE 或 DLL。

**注意:**如果设置了 RC_FILERES_FILE,qmake 对 .rc 文件的生成就失效了。这种情况下,qmake 不会对指定的 .rc 文件或 .res 或 .o 文件作进一步更改,有关 .rc 文件生成的变量不会有任何效果。

系统变量

QMAKE_TARGET_COMPANY

指定项目目标的公司名称

QMAKE_TARGET_DESCRIPTION

指定项目目标的描述信息

QMAKE_TARGET_COPYRIGHT

指定项目目标的版权信息

QMAKE_TARGET_PRODUCT

指定项目目标的产品名称

RC_CODEPAGE

指定应该被包含进一个 .rc 文件中的代码页

RC_LANG

指定应该被包含进一个 .rc 文件中的语言

注意: QMAKE_TARGET_COMPANYQMAKE_TARGET_DESCRIPTIONQMAKE_TARGET_COPYRIGHT、QMAKE_TARGET_PRODUCTRC_CODEPAGERC_LANG 均仅适用于 Windows, 而且只有在 VERSIONRC_ICONS 变量被设置,并且 RC_FILERES_FILE 变量没有被设置的情况下生效。

RC_ICONS

仅适用于 Windows,指定应该被包含进一个 .rc 文件中的图标,只有在 RC_FILERES_FILE 没有被设置的情况下生效。

VERSION

指定程序的版本号,需要将 TEMPLATE 指定为 app 或 lib。

在 Windows 中,如果没有设置变量 RC_FILERES_FILE,将会自动生成一个 .rc 文件,生成的文件包含 FILEVERSIONPRODUCTVERSION,由主版本、次版本、补丁版本和构建号填充,每个数字必须在 0 - 65535 范围内。

例如:

win32:VERSION = 1.2.3.4 # major.minor.patch.build
else:VERSION = 1.2.3    # major.minor.patch

windres

windres 可用于操纵 Windows 资源,windres 并不总是建成二进制实用程序的一部分,因为它只用于 Windows 目标。

windres 文档中,关于语言的描述如下:

–language val
Specify the default language to use when reading an rc file. val should be a hexadecimal language code. The low eight bits are the language, and the high eight bits are the sublanguage.

意思是:指定读取 rc 文件时使用的默认语言。val 应该是一个十六进制的语言代码,低 8 位是语言,高 8 位是子语言。

关于语言代码的描述可以参考:Language Identifier Constants and Strings

也就是说,如果要将程序的语言设置为“中文(简体)”,则只需要在 pro 中设置语言的“区域设置标识符”0x0004 即可:

RC_LANG = 0x0004

示例

如上所属,我们可以很轻易地将信息添加至 EXE 或 DLL 中:

这里写图片描述

只需要在 pro 中添加变量和对应的值:

# 版本信息
VERSION = 4.0.2.666

# 图标
RC_ICONS = Images/MyApp.ico

# 公司名称
QMAKE_TARGET_COMPANY = "Digia"

# 产品名称
QMAKE_TARGET_PRODUCT = "Qt Creator"

# 文件说明
QMAKE_TARGET_DESCRIPTION = "Qt Creator based on Qt 5.7.0 (MSVC 2013, 32 bit)"

# 版权信息
QMAKE_TARGET_COPYRIGHT = "Copyright 2008-2016 The Qt Company Ltd. All rights reserved."

# 中文(简体)
RC_LANG = 0x0004

执行 qmake -> build,再次打开 .rc 文件,对应的元素信息已经被填充进去了。

**建议:**如果需要反复修改变量值,最好的方式:clear -> qmake -> build。切记不要忘记 qmake,因为只有执行了 qmake,才会重新生成 .rc 文件,将新修改的值重新写入。

更多参考

### 如何在 PyCharm 中使用 Qt Designer #### 创建虚拟环境并安装依赖库 为了确保项目的独立性和稳定性,在开始之前建议先创建一个新的Python虚拟环境[^2]。 ```bash python -m venv myenv source myenv/bin/activate # Linux/MacOS myenv\Scripts\activate # Windows ``` 接着,通过pip命令来安装必要的软件包: ```bash pip install pyqt5 pyqt5-tools qtconsole ``` 这一步骤会下载并配置好PyQt5及其附带的各种工具,包括`pyuic`编译器和资源收集器`pyrcc`等实用程序。 #### 添加外部工具至 PyCharm 为了让PyCharm能够识别来自Qt的UI文件(.ui),需要设置几个外部工具以便于后续操作。进入IDE设置界面(`File -> Settings`)找到`Tools -> External Tools`选项卡,点击加号按钮新增如下三项条目: 1. **PyUIC**: 将`.ui`文件转换成对应的Python代码。 - Program: `pyuic5` - Arguments: `-x $FileName$ -o $FileNameWithoutExtension$.py` 2. **PyRCC**: 编译QRC资源文件为Python模块。 - Program: `pyrcc5` - Arguments: `$FilePath$ -o resources_rc.py` 3. **Linguist**: 提供翻译支持的功能。(可选) 完成上述配置之后就可以直接右键单击任意`.ui`或`.qrc`类型的文件并通过上下文菜单快速调用这些工具了。 #### 使用 Qt Designer 设计 UI 并集成到项目中 启动Qt Designer可以通过命令行执行`designer`指令或者借助PyCharm自带终端运行相同的操作。设计完成后保存为`.ui`格式,并利用前面提到过的“External Tools”中的PyUIC功能将其转化为Python源码形式。 对于已经存在的.ui文件也可以按照同样的方式进行处理;只需保证每次修改后都重新生成一次相应的Python脚本即可保持同步更新。 最后,在主应用逻辑里导入由Ui文件转化而来的类定义,并实例化它们作为顶层部件展示给用户[^4]: ```python from PyQt5 import QtWidgets import sys from ui_mainwindow import Ui_MainWindow # 假设这是从 .ui 文件转出来的 Python 类 class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 这样就完成了整个流程——从图形界面上的设计到最后的应用构建。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值