我正在努力使用PyQt5 QGraphicsSvgItem.renderer().load加载SVG图像。MWE:
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)
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(renderer)
self.svg_item.renderer().load(self.svg_data)
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_())虽然test.svg不会被加载,但test2.svg会被加载。这里看到:带有单个svg图像的窗口test.svg是一个蓝色矩形,test2.svg是一个黑色矩形。

我遗漏了什么?
(注意:我知道可以使用QGraphicsSvgItem('myfile.svg')或QGraphicsSvgItem(QSvgRenderer(my_svg_data))加载svg,但需要更新现有对象中的svg图像,因此这些方法对我不起作用。)
发布于 2021-06-29 23:55:50
问题是,当使用QSvgRenderer加载.svg时,QGraphicsSvgItem的boundingRect不会更新,因此不会绘制任何内容。一种可能的解决方案是使用向setElementId方法传递空字符串来重新计算几何图形。
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
scene = QGraphicsScene(self)
view = QGraphicsView(scene)
self.setCentralWidget(view)
self.svg_item = QGraphicsSvgItem()
renderer = QSvgRenderer()
self.svg_item.setSharedRenderer(renderer)
with open("test.svg", "rb") as f:
self.svg_item.renderer().load(f.read())
self.svg_item.setElementId("")
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)https://stackoverflow.com/questions/68180576
复制相似问题