实战PyQt5: 045-添加资源文件

添加资源文件

在使用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 的路径) :

实战PyQt5: 045-添加资源文件

 

使用该插件在 .qrc 文件上右键,选择编译资源文件:

实战PyQt5: 045-添加资源文件

 

编译结果如下:

实战PyQt5: 045-添加资源文件

 

使用时, 在代码中先导入编译出来的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 sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout)
from PyQt5.QtGui import QMovie
from PyQt5.QtCore import Qt, QSize
import 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()) 

运行结果如下图:

实战PyQt5: 045-添加资源文件

自定义资源加载测试

本文知识点

  • 构建一个自定义资源文件;
  • 将自定义资源文件转换成对应的py文件;
  • 加载自定义资源文件;
  • 重载resizeEvent()事件,获得尺寸变化信息。

前一篇:  实战PyQt5: 044-状态栏QStatusBar

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值