蓝色星晨|实战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输入以下内容:
【蓝色星晨|实战PyQt5: 045-添加资源文件】上面就是一个qrc文件的基本框架 , 假设我们需要使用一个在res下名为use-python.gif的动画文件 , 在qresource 项之间插入
这时的resource.qrc文件如下所示
编译资源文件述资源文件并不能直接使用 ,需要将其转换成对应的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文件内容如下:
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())
推荐阅读
- 蓝色海洋|这座无人小岛遍布三千多万件“致命物品”,我们正在亲手毁掉蓝色海洋……
- 淡蓝色的记忆|央视晒九部新片海报,杨幂童瑶入镜,46岁的人气男星只有背影
- 中国天气网|台风蓝色预警!“海神”将于明日凌晨进入吉林省境内
- 过膝靴@美女街拍:蓝色牛仔裤搭配过膝靴,满满的冷艳气场啊
- 蓝色星晨|继续打磨14nm!英特尔下一代桌面处理器明年Q1发布
- #黄圣依#黄圣依晒和姐姐们合影,杨澜穿蓝色礼服美颜下很大气,吴昕又美了
- 守不住的空城|蓝色的无袖连衣裙,气质的v领看上去精致又迷人
- 钱江晚报·小时新闻|蓝色保时捷在高速被拦!宁波小伙苦苦哀求,一查背后……
- 淡蓝色的记忆|《元气满满的哥哥》:王耀庆超短裤爆笑~胡军:掀开被子就来了吧
- 淡蓝色的记忆|《在劫难逃》孙晓萌才是系列杀人案的幕后主使赵彬彬是执行者?
