首頁>技術>

新增資原始檔

在使用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()事件,獲得尺寸變化資訊。

喜歡本文內容就收藏,點贊,評論,關注和轉發。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 解決win10-wsl不能更改預設777許可權的問題