PySide2:从变量而非文件加载SVG资源
直接从字符串加载SVG到PySide组件
核心是把SVG字符串转成字节流,用QSvgRenderer加载后关联到显示组件,无需生成本地文件。以下是两种实用实现方式:
方式一:用QSvgWidget快速加载
这是最简便的方式,直接借助QSvgWidget结合QSvgRenderer实现:
from PySide6.QtWidgets import QApplication, QSvgWidget, QWidget, QVBoxLayout from PySide6.QtSvg import QSvgRenderer from PySide6.QtCore import QByteArray import sys # 你的SVG字符串内容 svg_str = """<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg"> <rect x="20" y="20" width="160" height="160" fill="#2196F3" rx="20"/> </svg>""" app = QApplication(sys.argv) window = QWidget() window.setLayout(QVBoxLayout()) # 初始化QSvgWidget svg_widget = QSvgWidget() # 把字符串转成QByteArray格式 svg_bytes = QByteArray(svg_str.encode('utf-8')) # 创建渲染器并加载字节数据 renderer = QSvgRenderer(svg_bytes) # 将渲染器绑定到QSvgWidget svg_widget.setRenderer(renderer) window.layout().addWidget(svg_widget) window.show() sys.exit(app.exec())
方式二:用QLabel自定义渲染(适合需要调整绘制逻辑的场景)
如果需要对SVG绘制做自定义处理,可以用QLabel配合QSvgRenderer手动渲染:
from PySide6.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout from PySide6.QtSvg import QSvgRenderer from PySide6.QtCore import QByteArray from PySide6.QtGui import QPainter import sys svg_str = """<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg"> <circle cx="100" cy="100" r="80" fill="#4CAF50" /> </svg>""" app = QApplication(sys.argv) window = QWidget() window.setLayout(QVBoxLayout()) svg_bytes = QByteArray(svg_str.encode('utf-8')) renderer = QSvgRenderer(svg_bytes) # 初始化QLabel并设置尺寸为SVG默认大小 label = QLabel() label.setFixedSize(renderer.defaultSize()) # 重写paintEvent实现SVG渲染 def custom_paint(event): painter = QPainter(label) renderer.render(painter) label.paintEvent = custom_paint window.layout().addWidget(label) window.show() sys.exit(app.exec())
关键步骤说明:
- 先用
encode('utf-8')把SVG字符串转成字节,再用QByteArray包装,适配QSvgRenderer的加载要求 QSvgRenderer支持直接加载字节数据,绕开了文件读写步骤- 最后把渲染器关联到显示组件,就能直接展示SVG内容
内容的提问来源于stack exchange,提问作者Janosch
相关产品推荐
相关产品推荐

