首页 > 解决方案 > 如何使用 QGraphicsSvgItem.renderer().load 加载和 svg?

问题描述

我正在努力使用 PyQt5 加载 SVG 图像QGraphicsSvgItem.renderer().load。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 是一个黑色矩形。

带有单个 svg 图像的窗口

我错过了什么?

(注意:我知道我可以使用QGraphicsSvgItem('myfile.svg')或加载 svg QGraphicsSvgItem(QSvgRenderer(my_svg_data)),但我需要更新现有对象中的 svg 图像,因此这些方法对我不起作用。)

标签: pythonuser-interfacesvgpyqt5

解决方案


问题是当使用 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)

推荐阅读