You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 17:13:09