新增資原始檔
在使用PyQt進行圖形介面開發的時候不免要用到一些外部資源,比如圖片,qss配置檔案等。在前面程式碼中,遇到這類問題,我們使用絕對路徑的方式來解決,這種方式,本身有其不方便之處(比如,調整圖片路徑後,對應程式碼需要修改,程式碼的維護性變差), 還有在app進行打包釋出的時候,通常圖片資源卻不方便處理,app安裝的時候還必須確保app可以正確地找到這些資源,還有出於保護一些資原始檔的出發,不便於直接釋出圖片,qss資源等等。
為解決這些問題,我們可以使用Qt官方提供的工具將這些資原始檔編譯成二進位制檔案,直接打包到程式中。為了編譯這些資原始檔,通常我們需要在程式碼目錄下建立一個.qrc字尾的檔案,為了敘述方便,我們假設這個檔案的名字為resource.qrc,它和我們主py檔案位於同一個目錄。
一個 .qrc 資源集合檔案是用來指定檔案將被嵌入其資源的 XML 檔案。根節點為 RCC ,裡面可以包含若干 qresource 節點,每個 qresource 有自己的 prefix(路徑字首)屬性,qresource 節點包含了若干 file 節點,描述了各個檔案相對於 .qrc 的路徑。在 C++ Qt 的 IDE 中,我們新增資源後他會自動編譯出二進位制檔案。但在 PyQt 中,我們需要手動來完成這些操作。
在resource.qrc輸入以下內容:
<RCC> <qresource prefix="/"> </qresource></RCC>
上面就是一個qrc檔案的基本框架,假設我們需要使用一個在res下名為use-python.gif的動畫檔案,在qresource 項之間插入
<file>res/use-python.gif/file>
這時的resource.qrc檔案如下所示
<RCC> <qresource prefix="/"> <file>res/use-python.gif</file> </qresource></RCC>
編譯資原始檔述資原始檔並不能直接使用, 需要將其轉換成對應的py檔案才能匯入,轉換命令如下:
pyrcc5 -o rosource_rc.py resource.qrc# rosource_rc.py為轉換生成的包含資源資訊的py檔案# resource.qrc 為我們所寫的XML資原始檔
在VS Code中,我們可以藉助外掛PYQT Intergration提供的選單來轉換(需要先配置好 rcc 的路徑) :
使用該外掛在 .qrc 檔案上右鍵,選擇編譯資原始檔:
編譯結果如下:
使用時, 在程式碼中先匯入編譯出來的py檔案:
import resource_rc
在引用.qrc 資源中的檔案時,路徑為:冒號+prefix路徑字首+file相對路徑 。
self.movie = QMovie(":/res/use-python.gif")
資原始檔載入測試
建立檔案loadresourec.py, 播放use-python.gif,這次不使用絕對路徑載入檔案,而是使用資源載入的方式來實現。
resource.qrc檔案內容如下:
<RCC> <qresource prefix="/"> <file>res/use-python.gif</file> </qresource></RCC>
loadresourec.py完整程式碼如下:
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout)from PyQt5.QtGui import QMoviefrom PyQt5.QtCore import Qt, QSizeimport resource_rc class DemoLoadResource(QWidget): def __init__(self, parent=None): super(DemoLoadResource, self).__init__(parent) # 設定視窗標題 self.setWindowTitle("實戰PyQt5: LoadResource Demo!") # 設定視窗大小 self.resize(400, 300) self.initUi() def initUi(self): vLayout = QVBoxLayout(self) self.movie = QMovie(":/res/use-python.gif") self.disp_gif = QLabel(self) self.disp_gif.setMovie(self.movie) vLayout.addWidget(self.disp_gif) self.movie.start() self.setLayout(vLayout) def resizeEvent(self, event): newSize = self.disp_gif.size() newSize.setWidth(newSize.width() - 32) newSize.setHeight(newSize.height() - 32) self.movie.setScaledSize(newSize) super(DemoLoadResource, self).resizeEvent(event) if __name__ == '__main__': app = QApplication(sys.argv) window = DemoLoadResource() window.show() sys.exit(app.exec())
執行結果如下圖:
本文知識點構建一個自定義資原始檔;將自定義資原始檔轉換成對應的py檔案;載入自定義資原始檔;過載resizeEvent()事件,獲得尺寸變化資訊。喜歡本文內容就收藏,點贊,評論,關注和轉發。