添加資源文件
在使用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輸入以下內容:
????????
上面就是一個qrc文件的基本框架,假設我們需要使用一個在res下名為use-python.gif的動畫文件,在qresource 項之間插入
res/use-python.gif/file>
這時的resource.qrc文件如下所示
????????????res/use-python.gif????
編譯資源文件
述資源文件并不能直接使用, 需要將其轉換成對應的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文件內容如下:
????????????res/use-python.gif????
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()事件,獲得尺寸變化信息。
喜歡本文內容就收藏,點贊,評論,關注和轉發。