PyQt5 支持 Qt 的资源系统。这是用于在应用程序中嵌入图片和翻译文件等资源的工具。这使得这些资源的打包和分发更加容易。
一个 .qrc 资源集合文件是用来指定文件将被嵌入其资源的 XML 文件。在 C++ Qt 的 IDE 中,我们添加资源后他会自动编译出二进制文件。但在 PyQt 中,我们需要手动来完成这些操作(我不用 Eric,不知道这上面可不可以)。
(2022-10-12 补充)使用 pip 安装 PyQt5 之后,在 Python 的 Scripts 目录下有 pyrcc5.exe 和 pyuic5.exe 等工具(PyQt6 或者 PySide 可能不一样)。 这个 rcc 工具可以将 *.qrc 里面描述的图片、文档等编译成对应的源代码文件 *.py 或者独立的二进制资源文件 *.rcc。
假如我们需要展示一张本地图片,那么简单的情形可能是这样的,把图片放到工程目录里:
然后在代码里使用绝对路径 or 相对路径:
import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication,QLabel
if __name__=="__main__":
app=QApplication(sys.argv)
label=QLabel()
label.setPixmap(QPixmap("./image.jpg")) #相对路径
label.setWindowTitle("龚建波1992")
label.show()
sys.exit(app.exec_())
这里存在一个问题就是,在发布我们的 .exe 可执行程序时,还得把这个图片放到相同的目录里,除非我们使用工具再把这些文件封包到单个可执行程序里(https://blog.csdn.net/gongjianbo1992/article/details/80863247)。作为懒人,我们可以用 Qt 的资源系统来省点力气。
2.资源文件 .qrc 格式及编译首先,我们打开一个 Qt QML 程序的 .qrc 文件看看他的格式:
main.qml
BasicComponentDemo.qml
BasicInputComponent.qml
CustomComponentDemo.qml
可以看到,这是一个 XML 格式的文件,根节点为 RCC ,里面可以包含若干 qresource 节点,每个 qresource 有自己的 prefix(路径前缀)属性,qresource 节点包含了若干 file 节点,描述了各个文件相对于 .qrc 的路径。
首先,我们需要手写,或 Qt Designer 里生成,或脚本生成一个 .qrc 文件,这里我们手写:
image.jpg
资源文件不能直接使用,需要生成二进制文件,命令如下:
pyrcc5 -o src.py src.qrc
# src.py 为生成的二进制描述文件
# src.qrc 为我们写的 XML 资源文件
如果在 VS Code 里,我们可以借助插件提供的菜单来转换(需要先配置好 rcc 的路径) :
使用该插件在 .qrc 文件上右键,选择编译资源文件:
编译结果如下:
使用时,在代码中先 import 编译出来的二进制文件:
import src_rc
我们在引用 .qrc 资源中的文件时,路径为:冒号+prefix路径前缀+file相对路径 。
QPixmap(":/imgA.jpg")
3.使用资源文件
我们直接上手改之前的例子:
添加一个资源文件,并引入两个图片
然后手写 .qrc 文件,并编译为二进制文件(你也可以试试修改资源文件的 prefix 路径前缀试试)
imgA.jpg
folder/imgB.jpg
代码中引用资源文件
import sys
# 引入资源描述文件编译出来的二进制文件
import src_rc
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication,QLabel
if __name__=="__main__":
app=QApplication(sys.argv)
label=QLabel()
# 引用资源中的文件,以冒号开始
# label.setPixmap(QPixmap(":/imgA.jpg"))
label.setPixmap(QPixmap(":/folder/imgB.jpg"))
label.setWindowTitle("龚建波1992")
label.show()
sys.exit(app.exec_())
运行结果
最后使用 pyinstaller 来生成我们的 .exe 可执行文件。
(2021-06-28 补充)本文代码链接(我是在 Windows - VS Code 中测试的):https://github.com/gongjianbo/MyTestCode/tree/master/Py/TestPy_20210628_PyQtQrc
4.使用脚本生成这是网友写的脚本(https://blog.csdn.net/wn0112/article/details/47973953/),用目录中的图标、文件生成一个二进制资源文件。我们可以借鉴并制作自己的资源文件生成脚本。
import subprocess, os
images = os.listdir('./icons')
qss = os.listdir('./qss')
f = open('images.qrc', 'w+')
f.write(u'\n\n\n')
for item in images:
f.write(u'icons/'+ item +'\n')
for item in qss:
f.write(u'qss/'+ item +'\n')
f.write(u'\n')
f.close()
pipe = subprocess.Popen(r'pyrcc5 -o images.py images.qrc', stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE, creationflags=0x08)
有网友制作了资源编译到打包程序的脚本(https://my.oschina.net/flywuya/blog/1811669),我们可以借鉴并制作自己的自动编译脚本。
5.参考参考文档:https://www.riverbankcomputing.com/static/Docs/PyQt5/resources.html
参考博客:https://blog.csdn.net/wn0112/article/details/47973953/
参考博客:https://my.oschina.net/flywuya/blog/1811669