【PyQt学习篇 · ⑮】:qrc/rcc资源系统

news2024/11/24 3:48:30

文章目录

  • qrc使用介绍
  • rcc编译资源
    • rcc 的安装与基本使用
  • 编译成Python文件
  • 使用资源系统文件
    • 方式一:导入资源系统文件
    • 方式二:整合资源系统文件

qrc使用介绍

在PyQt中,qrc文件是一种资源文件,用于将应用程序所需的资源(如图像、音频文件、样式表等)打包到一个单独的二进制文件中,以便在运行时轻松地加载和访问这些资源。

qrc文件是用XML格式编写的,其中包含资源的路径和名称。PyQt提供了一个工具(pyrcc5),用于将qrc文件编译成Python代码,这些代码包含在应用程序中使用这些资源的必要逻辑。

示例
项目文件结构

$ tree Resources
Resources
├── photo
│   ├── PyQt.png
│   └── Struct.png
├── GIF
│   └── Thanks.gif
└── resources.qrc

以下是一个简单的resources.qrc示例:

<!DOCTYPE RCC>
<RCC>
    <qresource>
        <file>photo/PyQt.png</file>
        <file>photo/Struct.png</file>
    </qresource>
    <qresource>
        <file>GIF/Thanks.gif</file>
    </qresource>
</RCC>

在这个例子中,qrc文件指定了三个资源:PyQt.png、Struct.png、Thanks.gif,前两个位于photo文件夹中,最后一个位于GIF文件夹中。

rcc编译资源

rcc(Resource Compiler)是一个用于将资源文件编译成二进制格式的工具,它通常与Qt框架一起使用。在PyQt中,rcc工具用于编译qrc文件,将其中定义的资源打包成一个二进制文件,这样在运行时就可以方便地加载和使用这些资源,而不需要原始的资源文件。

rcc 的安装与基本使用

当通过pip安装PyQt或其他PySide时,会同时自动安装对应版本的 rcc 工具。这些工具的调用命令有所不同(详见下表),但使用方式与功能是一致的。激活已安装 PyQt 的 Python 虚拟环境,在命令行(注意不是 Python 交互式解释器)中输入对应的 rcc 命令即可。

平台rcc命令名称
PySide6pyside6-rcc
PySide2pyside2-rcc
PyQt6不提供
PyQt5pyrcc-5

注意:使用 PySide6 提供的 pyside6-rcc 工具编译出的 .py 文件,也可以放入 PyQt6 项目中使用,只需将文件开头的 from PySide6 import QtCore 替换为 from PyQt6 import QtCore 即可。

  • 例如,对于PyQt5,在命令行中使用cd命令,切换到当前项目文件夹下——Resources
    在这里插入图片描述

  • 然后,输入以下命令:

pyrcc5 -o compiled_resources.py resources.qrc

即可将 resources.qrc 中列出的资源文件编译到输出文件 compiled_resources.py 中。

编译成Python文件

运行成功后,在 .qrc 中声明的所有资源文件都已经被编译到 compiled_resources.py

以下是compiled_resources.py的内容:

# -*- coding: utf-8 -*-

# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2)
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore

qt_resource_data = b"......"

qt_resource_name = b"......"

qt_resource_struct_v1 = b"......"

qt_resource_struct_v2 = b"......"

qt_version = [int(v) for v in QtCore.qVersion().split('.')]
if qt_version < [5, 8, 0]:
    rcc_version = 1
    qt_resource_struct = qt_resource_struct_v1
else:
    rcc_version = 2
    qt_resource_struct = qt_resource_struct_v2

def qInitResources():
    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

def qCleanupResources():
    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

qInitResources()

最上方的注释标明了该文件由与 Qt v5.15.2 版本匹配的资源编译器生成。并警告用户不要直接编辑该文件,因为所有修改都会被下一次编译操作覆盖掉。

qt_resource_dataqt_resource_nameqt_resource_struct_v1qt_resource_struct_v2中是二进制编码字符串,因为字符串过长,以上用省略号(……)代替。

其中:

  • qt_resource_data - 资源文件内容数据
  • qt_resource_name - 资源文件名称
  • qt_resource_struct - 资源结构

函数 qInitResources()qCleanupResources(),分别对应向 Qt 中注册资源与清理资源。

代码的最后一行调用了注册资源函数。

使用资源系统文件

方式一:导入资源系统文件

资源系统文件——compiled_resources.py已生成,以下是使用案例。

创建一个demo.py文件,在demo.py文件中导入资源系统文件进行使用:

# 以下是demo.py文件内容

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QMovie
import sys
import compiled_resources

class Demo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setup_ui()

    def setup_ui(self):
        self.widget = QWidget()
        self.setCentralWidget(self.widget)

        vbox = QVBoxLayout(self.widget)

        label1 = QLabel()
        label1.setPixmap(QPixmap(':/photo/PyQt.png').scaled(50, 50))

        label2 = QLabel()
        label2.setPixmap(QPixmap(':/photo/Struct.png').scaled(50, 50))
        # 或
        # label2.setStyleSheet('background-image: url(:/photo/Struct.png); background-size: 50px 50x; background-repeat: no-repeat;')

        movie = QMovie(':/GIF/Thanks.gif')
        label3 = QLabel()
        label3.setMovie(movie)
        movie.start()

        vbox.addWidget(label1)
        vbox.addWidget(label2)
        vbox.addWidget(label3)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    d = Demo()
    d.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

方式二:整合资源系统文件

compiled_resources.py文件中的内容,写入到demo.py文件中。

例:

# 以下是demo.py文件内容

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QMovie
import sys
import compiled_resources

class Demo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setup_ui()

    def setup_ui(self):
        self.widget = QWidget()
        self.setCentralWidget(self.widget)

        vbox = QVBoxLayout(self.widget)

        label1 = QLabel()
        label1.setPixmap(QPixmap(':/photo/PyQt.png').scaled(50, 50))

        label2 = QLabel()
        label2.setPixmap(QPixmap(':/photo/Struct.png').scaled(50, 50))
        # 或
        # label2.setStyleSheet('background-image: url(:/photo/Struct.png); background-size: 50px 50x; background-repeat: no-repeat;')

        movie = QMovie(':/GIF/Thanks.gif')
        label3 = QLabel()
        label3.setMovie(movie)
        movie.start()

        vbox.addWidget(label1)
        vbox.addWidget(label2)
        vbox.addWidget(label3)

from PyQt5 import QtCore

qt_resource_data = b"......"

qt_resource_name = b"......"

qt_resource_struct_v1 = b"......"

qt_resource_struct_v2 = b"......"

qt_version = [int(v) for v in QtCore.qVersion().split('.')]
if qt_version < [5, 8, 0]:
    rcc_version = 1
    qt_resource_struct = qt_resource_struct_v1
else:
    rcc_version = 2
    qt_resource_struct = qt_resource_struct_v2

def qInitResources():
    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

def qCleanupResources():
    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

qInitResources()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    d = Demo()
    d.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…

日历插件fullcalendar【笔记】

日历插件fullcalendar【笔记】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

事务传播行为Propagation

目录 背景Propagation测试程序1测试程序2分析 背景 前段时间&#xff0c;某个项目在部署时&#xff0c;被公司的一个检测拦截了&#xff0c;提示报错如下&#xff1a; Your code exists Method or Class with Transactional annotation that not use Propagation.REQUIRED.有…

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相…

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统&#xff0c;是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效&#xff0c;不仅引入了分割视图和侧边栏&#xff0c;还带来了全新的音乐和播客应用&#xff0c;极大地提升了用户体验。在隐私保护和安全性方面&…

Oracle 数据库、实例、用户、表空间、表之间的关系(新手入门)

Oracle 数据库、实例、用户、表空间、表之间的关系 数据库&#xff1a; Oracle数据库是数据的物理存储。这就包括&#xff08;数据文件ORA或者DBF、控制文件、联机日志、参数文件&#xff09;。其实Oracle数据库的概念和其它数据库不一样&#xff0c;这里的数据库是一个操作系…

python中dropna()函数的作用举例说明

在Python中&#xff0c;dropna()是一个Pandas库中的函数&#xff0c;用于从数据框&#xff08;DataFrame&#xff09;中删除包含缺失值&#xff08;NaN&#xff09;的行或列。它用于数据清洗和预处理阶段&#xff0c;以便去除缺失值&#xff0c;使数据更加规整。 dropna()函数…

软件杯 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

nginx的缓存和gzip

nginx的缓存 缓存的基本思想是利用客户端访问的时间局限性&#xff0c;将客户端访问过的内容做一个副本&#xff0c;在一定时间内存放到本地&#xff0c;当改数据下次被访问时&#xff0c;不必连接到后端服务器反复去查询数据&#xff0c;而是由本地保存的副本响应数据。 保存…

服务器固定IP(固定出口IP)去访问外部服务

背景 服务器上有多个IP&#xff0c;那么在服务器请求外部服务的时候&#xff0c;到底是使用哪个IP呢&#xff1f;如果要使用特定的IP去请求外部服务&#xff0c;该如何设置呢&#xff1f; 分析 遇到一个实际的场景&#xff1a; 我们产品和其他产品联调&#xff0c;我们的服务…

【A-010】基于SSH的宠物狗商城系统(含论文)

【A-010】基于SSH的宠物狗商城系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 项目介绍&#xff1a; 在科学技术飞速发展的今天&#xff0c;互联网成为人们快速获取、发布和传递信息的重要渠道&am…

【Docker笔记01】【基础内容】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、Docker…

基于springboot实现房屋租赁系统项目【项目源码+论文说明】

基于springboot实现房屋租赁系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

浮点数(小数)在计算机中如何用二进制存储?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/137182814 出自【进步*于辰的博客】 注&#xff1a;为了阐述更加严谨&#xff0c;本篇文章中将使…

【练习】滑动窗口思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Java算法&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.长度最小的子数组 题目解析 讲解 代码实现 2.无…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…

机器视觉学习(八)—— 阈值化

目录 一、阈值化 二、二值化和示例 2.1 二值化 2.2 示例代码 一、阈值化 OpenCV是一个开源的计算机视觉库&#xff0c;可以用于图像处理和计算机视觉任务。阈值化是图像处理中的一种常见操作&#xff0c;可以将图像的像素值分成两个或多个不同的类别&#xff0c;通常是黑色…

python统计分析——双样本均值比较

参考资料&#xff1a;python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时&#xff0c;有两种情况必须区分开。在第一种情况中&#xff0c;同一对象在不同时候的两个记录值进行相互比较。例如&#xff0c;用学生们进入初中时的身高和他们一年后的身高&…