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

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