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.pswp.cn/news/258915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258915.shtml
英文地址,請注明出處:http://en.pswp.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 主要包括以下內容&…