pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件

e39e56b2-db72-4615-81fe-a719e4b3e0c2

添加资源文件

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

92ab7fc85f3e447f8778895ff3293665

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

cb8a0a8ca87e4564bed067d057ea5f27

编译结果如下:

ba99a85048d74514a7785a902ed42c4b

使用时, 在代码中先导入编译出来的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()) 

运行结果如下图:

d76253c733654ac992e6075ef3c82a25

自定义资源加载测试

本文知识点

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

喜欢本文内容就收藏,点赞,评论,关注和转发。

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

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

相关文章

《 Python树莓派编程》——2.7 总结

本节书摘来自华章出版社《Python树莓派编程》一书中的第2章,第2.7节,作者:[美]沃尔弗拉姆多纳特(Wolfram Donat)著 韩德强 等译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.7 总结 本章简…

ACM的输入输出总结

关于ACM的输入输出&#xff08;一&#xff09; 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两种方法 c常用: #include <fstream.h>ifstream…

hdu 2064汉诺塔III 递推

汉诺塔递推题&#xff0c;比汉诺塔多了一个限制条件&#xff0c;盘子只允许在相邻的柱子之间移动。 分析&#xff1a; 第1步:初始状态&#xff1b; 第2步:把上面的n-1个盘移到第3号杆上&#xff1b; 第3步:把第n个盘从1移到2&#xff1b; 第4步:把前n-1个从3移到1&#xff0c;给…

西门子ddc_铁门关西门子两通电动阀VVF42.25-10C+SKD60西

铁门关西门子两通电动阀西SIEMENS/西门子电动温控阀、控制箱、电动蝶阀、电动球阀、超声波热量表、超声波流量计、电磁流量计阀体灰口铸铁 EN-GJL-2502.霍尼韦尔主营&#xff1a;楼宇资料系统、热网自控系统、风机盘管电动两通阀、空气压差开关、水流开关、电动执行器、风阀执行…

swap关于指针的使用

先看下面两个例子&#xff1a; #include <iostream> // std::cout #include <utility> // std::swapint main() {int x 10, y 20; // x:10 y:20int* p1 &x;int* p2 &y;std::swap(*p1, *p2); // x:20 y:10 …

JS-键盘事件之方向键移动元素

注意三点&#xff1a; 1&#xff1a;事件名称onkeydown。 2&#xff1a;事件加给document&#xff0c;而非window。 3&#xff1a; 把元素的top&#xff0c;left值分别用offsetTop&#xff0c;offsetLeft来设定。 <!DOCTYPE html> <html><head><meta char…

Swift学习字符串、数组、字典

一.字符串的使用 let wiseWords "\"I am a handsome\"-boy" var emptyString "" if emptyString.isEmpty{ println("这是一个空值") }简单说明&#xff1a;isEmpty方法是用来判断字符串是否为空值的&#xff0c;之后会执行if语句中的…

python对excel操作简书_Python读写Excel表格,就是这么简单粗暴又好用

最近在做一些数据处理和计算的工作&#xff0c;因为数据是以.CSV格式保存的&#xff0c;因此刚开始直接用Excel来处理。 但是做着做着发现重复的劳动&#xff0c;其实并没有多大的意义&#xff0c;于是就想着写个小工具帮着处理。 以前正好在一本书上看到过&#xff0c;使用Pyt…

九度 1470 调整方阵

题目描述&#xff1a; 输入一个N&#xff08;N<10&#xff09;阶方阵&#xff0c;按照如下方式调整方阵&#xff1a;1.将第一列中最大数所在的行与第一行对调。2.将第二列中从第二行到第N行最大数所在的行与第二行对调。依此类推...N-1.将第N-1列中从第N-1行到第N行最大数所…

halcon/c++接口基础 之 halcon初认识

从今天开始&#xff0c;开始更新博客&#xff0c;主要分享自己最近正在翻译的Halcon/C教程。先给出第一篇文章&#xff0c;由于此文章&#xff0c;是用latex写的&#xff0c;直接导成html&#xff0c;保存在七牛云存储上&#xff0c;所以直接点击链接就看到&#xff0c;后面我将…

指数型组织形成的 9 大驱动因素

指数时代&#xff0c;是一个前所未有的激动人心的世界。 Airbnb, 谷歌, 亚马逊和GitHub这些知名的公司&#xff0c;都有一个让人称羡的共同点&#xff0c;那就是——他们都是非常成功的指数型组织&#xff08;Exponential Organizations&#xff0c;ExO’s&#xff09;。 “在当…

Java for LeetCode 061 Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k 2, return 4->5->1->2->3->NULL. 解题思路&#xff1a; 只需找到对应的位置&#xff0c;然后指向head&…

mysqld:表mysql.plugin不存在_99%测试工程师不知道的数据库知识|干货

点击上方“蓝字”关注我们数据库&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所&#xff0c;用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立…

Windows Phone 执行模型概述

Windows Phone 执行模型控制在 Windows Phone 上运行的应用程序的生命周期&#xff0c;该过程从启动应用程序开始&#xff0c;直至应用程序终止。 该执行模型旨在始终为最终用户提供快速响应的体验。为此&#xff0c;在任何给定时间内&#xff0c;Windows Phone 仅允许一个应用…

halcon/c++接口基础 之 构造函数与Halcon算子

Halcon/C提供了构造函数&#xff0c;主要基于适合的Halcon算子。比如说HImage和HBarCode基于read_image and create_bar_code_model。 请注意当前的Halcon版本针对不同的算子构造函数的功能不同。如下我们介绍了一些最常用的Halcon算子&#xff0c;而一个完整的构造函数列表可…

Android Wifi简单的梳理【转】

本文转载自&#xff1a;http://blog.csdn.net/gabbzang/article/details/10005411 代表一个已经配置过的网络。包含网络ID(networkId)、该网络ID代表的网络的BSSID和SSID、加密机制、密码等信息。 WifiInfo&#xff1a; 代表一个正在建立或者已经建立的网络连接。该网络的BSSID…

fenby C语言 P30

int a[5]&#xff0c;*pa; int a[5],*p&a[0]; #include <stdio.h> int main(void){ int a[5],*pa,i; for(i0;i<5;i) { *p1; p; }pp-5;for(i0;i<5;i,p)printf("%d\n",*p);return 0;}转载于:https://www.cnblogs.com/amiaojiang/p/4507114.html

bat自动输入用户名和密码_「小白到大牛之路6」交换机后台管理之重复输入用户名和密码...

项目需求解决项目5中存在的问题&#xff1a;用户名和密码只能输入一次。如果输入错误&#xff0c;就没有机会重新输入。项目实现#include int main(void) {// 定义变量&#xff0c;用来表示用户名和密码char name[32];char password[16];//输入用户名和密码while (1) {// 输入用…

并行计算简介

转自&#xff1a;http://www.cnblogs.com/wasd/archive/2009/04/07/1430859.html 并行计算简介 作者&#xff1a; Blaise Barney, 劳伦斯利弗莫尔国家实验室 译者&#xff1a;卢洋&#xff0c;同济大学&#xff0c;2009年4月 原文地址&#xff1a;https://computing.llnl.gov/t…

开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」

先放上 Live 地址&#xff1a; www.zhihu.com/lives/84274… 本次 Live 将深入剖析 Node.js 包与模块机制&#xff0c;包括且不限于解析 Node.js 源码、社区规范等。本人认为这是作为一个合格 Node.js 开发者哪怕是不深入也要了解的姿势之一。 本次 Live 主要包括以下内容&…