首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QGraphicsSvgItem.renderer().load加载和svg?

如何使用QGraphicsSvgItem.renderer().load加载和svg?
EN

Stack Overflow用户
提问于 2021-06-29 22:20:22
回答 1查看 44关注 0票数 0

我正在努力使用PyQt5 QGraphicsSvgItem.renderer().load加载SVG图像。MWE:

代码语言:javascript
复制
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图像,因此这些方法对我不起作用。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 23:55:50

问题是,当使用QSvgRenderer加载.svg时,QGraphicsSvgItem的boundingRect不会更新,因此不会绘制任何内容。一种可能的解决方案是使用向setElementId方法传递空字符串来重新计算几何图形。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68180576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档