PyQt5,资源文件 .qrc 的使用

0.前言

PyQt5 支持 Qt 的资源系统。这是用于在应用程序中嵌入图片和翻译文件等资源的工具。这使得这些资源的打包和分发更加容易。

一个 .qrc 资源集合文件是用来指定文件将被嵌入其资源的 XML 文件。在 C++ Qt 的 IDE 中,我们添加资源后他会自动编译出二进制文件。但在 PyQt 中,我们需要手动来完成这些操作(我不用 Eric,不知道这上面可不可以)。

目录

1.未使用资源文件的情况

2.资源文件 .qrc 格式及编译

3.使用资源文件

4.使用脚本生成

5.参考


1.未使用资源文件的情况

假如我们需要展示一张本地图片,那么简单的情形可能是这样的,把图片放到工程目录里:

然后在代码里使用绝对路径 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 文件看看他的格式:

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
        <file>BasicComponentDemo.qml</file>
        <file>BasicInputComponent.qml</file>
        <file>CustomComponentDemo.qml</file>
    </qresource>
</RCC>

可以看到,这是一个 XML 格式的文件,根节点为 RCC ,里面可以包含若干 qresource 节点,每个 qresource 有自己的 prefix(路径前缀)属性,qresource 节点包含了若干 file 节点,描述了各个文件相对于 .qrc 的路径。

首先,我们需要手写,或 Qt Designer 里生成,或脚本生成一个 .qrc 文件,这里我们手写:

<RCC>
    <qresource prefix="/">
        <file>image.jpg</file>
    </qresource>
</RCC>

资源文件不能直接使用,需要生成二进制文件,命令如下:

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 路径前缀试试)

<RCC>
    <qresource prefix="/">
        <file>imgA.jpg</file>
        <file>folder/imgB.jpg</file>
    </qresource>
</RCC>

代码中引用资源文件

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 可执行文件。

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'<!DOCTYPE RCC>\n<RCC version="1.0">\n<qresource>\n')

for item in images:
    f.write(u'<file alias="icons/'+ item +'">icons/'+ item +'</file>\n')

for item in qss:
    f.write(u'<file alias="qss/'+ item +'">qss/'+ item +'</file>\n')

f.write(u'</qresource>\n</RCC>')
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章