PyQt5中使用QGraphicsSvgItem.renderer().load加载SVG失败的问题排查
解决QGraphicsSvgItem使用共享渲染器加载SVG不显示的问题
我帮你找到了问题所在,主要有两个关键点被你忽略了:
1. 渲染器对象被提前回收
你在__init__里创建的renderer是一个局部变量,当这个方法执行完毕后,Python的垃圾回收机制会销毁这个对象。而你的QGraphicsSvgItem设置了共享这个渲染器,当渲染器被销毁后,item自然没有有效的渲染资源来显示SVG内容。
2. SVG加载后未触发item更新
即使渲染器是有效的,在加载新的SVG数据后,QGraphicsSvgItem不会自动重新计算边界和刷新显示,需要手动触发更新操作。
修正后的代码
from PyQt5.QtCore import QByteArray from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QMainWindow, QApplication class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) scene = QGraphicsScene(self) view = QGraphicsView(scene) # 将渲染器设为实例成员,避免被垃圾回收 self.renderer = QSvgRenderer() self.setCentralWidget(view) with open('test.svg') as fh: self.svg_data = fh.read() self.svg_data = QByteArray(self.svg_data.encode()) self.svg_item = QGraphicsSvgItem() self.svg_item.setSharedRenderer(self.renderer) # 直接通过成员渲染器加载SVG数据 self.renderer.load(self.svg_data) # 强制item更新,刷新显示和边界 self.svg_item.update() scene.addItem(self.svg_item) self.svg_item.setPos(-50, -50) self.svg_item2 = QGraphicsSvgItem('test2.svg') scene.addItem(self.svg_item2) self.svg_item2.setPos(50, 50) if __name__ == '__main__': import sys app = QApplication(sys.argv) w = MainWindow() w.resize(640, 480) w.show() sys.exit(app.exec_())
额外说明
如果你之后需要动态更新这个SVG的内容,只需要执行以下步骤即可:
- 准备新的SVG数据(字节数组格式)
- 调用
self.renderer.load(new_svg_data)加载新内容 - 调用
self.svg_item.update()触发刷新
这样就能实现对已有QGraphicsSvgItem对象的SVG内容更新,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Luan Carvalho
相关产品推荐
相关产品推荐

