python - 如何使用 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 是一个黑色矩形。
我错过了什么?
(注意:我知道我可以使用QGraphicsSvgItem('myfile.svg')
或加载 svg QGraphicsSvgItem(QSvgRenderer(my_svg_data))
,但我需要更新现有对象中的 svg 图像,因此这些方法对我不起作用。)
解决方案
问题是当使用 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)
推荐阅读
- java - 列表列表列表到扁平列表映射的映射
- java - 在导航抽屉中实现退出项
- javascript - 如何找出我的 WebSocket 连接失败的原因?
- vue.js - Nuxt.js 静态站点相对 url
- c# - 如何使用自定义类型重载 System.Math 方法
- c# - Azure 服务总线触发器未同时处理基于会话的队列
- coldfusion - Coldfusion StructSetMetaData 不更新结构内数组中的项目
- flutter - 限制 showDialog 屏障和内容的大小
- templates - Wagtail CMS 样式覆盖
- azure - 具有 Vnet 集成和专用端点的函数应用程序 -> 服务器响应:服务不可用