0.前言
PyQt5 支持 Qt 的資源系統。這是用於在應用程序中嵌入圖片和翻譯文件等資源的工具。這使得這些資源的打包和分發更加容易。
一個 .qrc 資源集合文件是用來指定文件將被嵌入其資源的 XML 文件。在 C++ Qt 的 IDE 中,我們添加資源後他會自動編譯出二進制文件。但在 PyQt 中,我們需要手動來完成這些操作(我不用 Eric,不知道這上面可不可以)。
目錄
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