Qt SVG元素百分比尺寸显示异常问题求助
问题:PyQt6加载SVG时百分比尺寸的矩形未正确缩放
我有一个SVG文件,其中矩形使用100%作为宽高,在Emacs查看器、Inkscape、Firefox中都能正常显示(矩形填满整个SVG画布),但用PyQt6代码加载时,矩形却呈现默认的100x100大小,没有按100%缩放。如果把100%替换为具体数值(比如400)则显示正常,请问如何修改代码让PyQt6支持百分比尺寸的SVG元素?
SVG文件内容
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400.00" height="400.00" viewBox="0 0 400.00 400.00"> <rect width="100%" height="100%" stroke="none" fill="#FF0000" /> <polygon points="50,200 350,200 350,50 50,50" stroke-width="0.75" stroke="#000000" fill="none"/> </svg>
现有PyQt6代码
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QGraphicsView, QGraphicsScene, QApplication from PyQt6.QtSvgWidgets import QGraphicsSvgItem from PyQt6.QtSvg import QSvgRenderer import sys class PlotPanel(QWidget): def __init__(self, svgpath, parent=None): super().__init__(parent) layout = QVBoxLayout(self) self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) layout.addWidget(self.view) data = open(svgpath).read() self.renderer = QSvgRenderer(bytes(data, "UTF-8")) self.svg = QGraphicsSvgItem() self.svg.setSharedRenderer(self.renderer) self.scene.addItem(self.svg) app = QApplication(sys.argv) svgpath = sys.argv[1] window = PlotPanel(svgpath) window.show() app.exec()
解决方案
问题根源在于QGraphicsSvgItem默认未正确基于SVG的viewBox确定渲染区域,导致百分比尺寸的元素无法计算相对大小。以下两种方法均可修复:
方法1:手动设置SVG Item的渲染矩形
在创建QGraphicsSvgItem并绑定渲染器后,添加代码将Item的渲染区域与SVG的viewBox绑定:
self.svg = QGraphicsSvgItem() self.svg.setSharedRenderer(self.renderer) # 获取SVG的viewBox并设置为Item的渲染矩形 view_box = self.renderer.viewBox() self.svg.setRect(view_box) self.scene.addItem(self.svg)
方法2:调整场景与视图的适配逻辑
修改代码让场景范围匹配SVG的viewBox,并让视图自适应场景大小(保持宽高比):
首先导入Qt枚举:
from PyQt6.QtCore import Qt
然后修改PlotPanel的初始化代码:
self.scene.addItem(self.svg) # 设置场景范围为SVG的viewBox self.scene.setSceneRect(self.renderer.viewBox()) # 让视图自适应场景,保持宽高比 self.view.fitInView(self.scene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
两种方法都能让PyQt的SVG渲染器正确解析百分比尺寸的元素,确保矩形填满整个SVG画布。
内容的提问来源于stack exchange,提问作者Spacedman
相关产品推荐
相关产品推荐

