四时宝库

程序员的知识宝库

Python入坑系列-pyside6桌面编程之使用QRC加载各种资源文件

通过本文章,可以掌握以下内容:

  1. Pyside6 资源引入方式
  2. Pyside6 QRC资源文件使用
  3. Pyside6 加载远程资源文件

1、资源引入方式

在开发Pyside6程序是,支持直接引入和通过QRC资源系统将资源引入,每种方式各有利弊

直接引入

直接引入资源意味着在代码中直接使用文件的路径来访问资源,如图像、样式表等

比如:

pixmap = QPixmap("../icons/bg2.jpg")

优点:

  • 简单直接:对于小型项目或快速原型开发,直接引用资源路径是最简单直接的方法。
  • 易于调试:直接修改资源文件,不需要重新编译资源,可以立即看到效果。

缺点:

  • 部署复杂:在部署应用程序时,需要确保所有资源文件的路径都正确,并且随应用程序一起正确分发。
  • 性能考虑:大量使用外部资源文件可能会影响应用程序的启动时间和运行性能。

QRC文件使用

PySide6 中使用 QRC 文件可以有效地管理和访问本地应用程序嵌入的资源,如图像、图标、样式表、字体、音频和视频等。。QRC 文件是一个 XML 文件,它列出了包含在应用程序中的资源。这些资源在编译时会被嵌入到应用程序的二进制文件中,使得在运行时可以方便地访问它们。

优点:

  • 便于部署:所有资源都被编译到应用程序的二进制文件中,简化了部署过程,不需要担心资源文件的丢失或路径问题。
  • 性能提升:资源被嵌入到应用程序中,可以减少应用程序启动时加载外部资源的时间。
  • 跨平台一致性:确保应用程序在不同平台和配置中表现一致,因为资源文件已经被嵌入。

缺点:

  • 更新资源需要重新编译:每次资源更新后,都需要重新编译 QRC 文件,这可能会增加开发过程中的时间。
  • 有门槛,需要学习QRC:相比直接引用资源路径,使用 QRC 需要学习额外的步骤,如创建 QRC 文件和编译资源。可参考:https://doc.qt.io/qt-6/resources.html
  • 不支持从远程服务器加载资源

2、Pyside6 QRC文件使用

以下是如何使用 QRC 文件的步骤:

步骤 1: 创建 QRC 文件

创建一个 QRC 文件(例如 resources.qrc),并在其中定义你的资源。例如:

<RCC>
    <qresource prefix="/images">
        <!-- 相对rcc文件路径 -->
        <file alias="logo">logo.jpg</file>
    </qresource>
    <qresource prefix="/styles">
        <file>style.qss</file>
    </qresource>
</RCC>

qresource标签

于定义资源的集合,并且可以包含一些属性来控制资源的加载和访问方式,该标签常用属性:

  • prefix

prefix 属性定义了资源的访问路径前缀。这个前缀将被用于在应用程序中引用这些资源。如果没有指定 prefix,默认的前缀是根路径 /。

  • lang

lang 属性允许你为不同的语言环境指定不同的资源。这可以用于国际化和本地化,例如,根据用户的语言设置加载不同的图片或文本。

file元素

用于指定要包含在资源文件中的实际文件。这个标签可以包含一些属性,用于更精确地控制资源的处理和引用方式,该标签常用属性:

  • alias

alias 属性允许为文件指定一个别名,这个别名可以在应用程序中用来引用该文件。如果不使用 alias,则默认使用文件的原始路径作为引用路径。

步骤 2: 编译 QRC 文件

使用 PySide6 提供的 pyside6-rcc 命令行工具将 QRC 文件编译成 Python 代码。在命令行中运行:

pyside6-rcc .\qrc\resource.qrc -o .\qrc\resource_rc.py

步骤 3: 在应用程序中使用资源

在 PySide6 应用程序中,首先需要导入生成的资源模块

import resources_rc

然后,你可以通过指定的路径来使用这些资源,注意字符串前面需要用“:”冒号开始。例如,如果你想在 QLabel 中显示一个图像,可以这样做:

from PySide6.QtWidgets import QApplication, QLabel
from PySide6.QtGui import QPixmap
import sys
import resource_rc #导入资源文件
if __name__ == '__main__':
    app = QApplication(sys.argv)
    label = QLabel()
    label.setMinimumSize(300,300)
    pixmap = QPixmap(":/images/logo")  #使用资源前缀和别名加载图片
    label.setPixmap(pixmap)
    label.show()
    sys.exit(app.exec_())

通过这种方式,我们可以引用一下资源:

  • 样式文件资源
app = QApplication([])
app.setStyleSheet(":/styles/style.qss")
  • 图像和图标文件资源
pixmap = QPixmap(":/images/logo")
  • 字体文件资源

qrc文件内容:

<RCC>
<qresource>
    <file alias="customFont">fonts/MyCustomFont.ttf</file>
</qresource>
</RCC>

简单示例:

from PySide6.QtWidgets import QApplication, QLabel
from PySide6.QtGui import QFontDatabase, QFont
import resources_rc  # 导入资源文件

app = QApplication([])
# 加载字体
font_id = QFontDatabase.addApplicationFont(":/customFont")
font_family = QFontDatabase.applicationFontFamilies(font_id)[0]
font = QFont(font_family)

# 使用字体
label = QLabel("Hello, world!")
label.setFont(font)
label.show()
app.exec()
  • 音频文件资源

qrc文件内容:

<RCC>
<qresource>
    <file alias="sampleVideo">media/sample_video.mp4</file>
    <file alias="sampleAudio">media/sample_audio.mp3</file>
</qresource>
</RCC>

简单示例:

from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout
from PySide6.QtMultimedia import QMediaPlayer, QMediaContent
from PySide6.QtMultimediaWidgets import QVideoWidget
import resources_rc  # 导入资源文件

app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)

# 设置视频播放器
video_widget = QVideoWidget()
player = QMediaPlayer()
player.setVideoOutput(video_widget)
player.setMedia(QMediaContent(QUrl("qrc:/sampleVideo")))
video_widget.show()
player.play()

# 添加到布局
layout.addWidget(video_widget)
window.setLayout(layout)
window.show()
app.exec()

3、Pyside6 加载远程资源

在 PySide6 中,获取和使用远程图片和 QSS (Qt Style Sheets) 资源通常涉及网络请求来下载这些资源,可以使用标准的 Python 库如 requests 来下载资源,然后使用 PySide6 的控件加载资源

安装必要的库

pip install requests

获取远程图片资源

from PySide6.QtWidgets import QApplication, QLabel
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt
import requests
from io import BytesIO
app = QApplication([])
# 下载图片
url = "https://example.com/path/to/image.png"
response = requests.get(url)
image_pixmap = QPixmap()
image_pixmap.loadFromData(response.content)
# 显示图片
label = QLabel()
label.setPixmap(image_pixmap)
label.setScaledContents(True)  # 使图片适应标签大小
label.show()
app.exec()

获取远程QSS资源

from PySide6.QtWidgets import QApplication, QWidget
import requests
app = QApplication([])

# 下载 QSS
url = "https://example.com/path/to/style.qss"
response = requests.get(url)
style_sheet = response.text
# 应用 QSS
window = QWidget()
window.setStyleSheet(style_sheet)
window.show()
app.exec()

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接