python - PyQt:为 QGraphicsSvgItem 操作 svg 文件
问题描述
我的主要目标是更改给定 svg 文件的笔画宽度,但我看不到这样做的内置方法。
不幸的是,宽度在 svg 文件中被硬编码,我最初的想法是缓冲数据,并在更改渲染的 svg 文件之前在内存中对其进行编辑。但这只是额外的处理开销。
接下来,我考虑将 svg 转换为类似 dom - 树的结构,但随后我可能必须在将其加载到 QGraphicsSvgItem 之前再次将其保存回来,这将是动态更改线条粗细的一个奇怪的中间步骤。
这是一个示例 svg 文件,
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="3.2421772mm"
height="6.1269817mm"
viewBox="0 0 3.2421772 6.1269817"
version="1.1"
id="svg12403"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="Bag.svg">
<defs
id="defs12397" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-229.58734"
inkscape:cy="-219.85002"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1366"
inkscape:window-height="705"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata12400">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-43.736054,-84.5377)">
<g
id="use26359"
transform="matrix(0.26458333,0,0,0.26458333,-3.9887501,73.928193)">
<desc
id="desc12960">Bag</desc>
<title
id="title12962">Bag</title>
<path
d="m 180.61365,49.4094 v 13.609494 h 11.78107 V 49.4094 C 192.27,46.875236 189.67,44.872517 186.50494,44.872517 c -3.16454,0 -5.76448,2.002719 -5.89129,4.536883 z m 2.94488,-9.07316 2.94641,4.536277 2.9449,-4.536277 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381"
id="path12964"
inkscape:connector-curvature="0" />
<g
style="stroke-width:1.31504369"
id="g12968"
transform="matrix(0.507302,0,0,0.50958516,89.699529,-958.6518)">
<path
d="m 179.211,1978.199 v 26.707 h 23.223 v -26.707 c -0.246,-4.972 -5.371,-8.902 -11.61,-8.902 -6.238,0 -11.363,3.93 -11.613,8.902 z m 5.805,-17.804 5.808,8.902 5.805,-8.902 z m 5.808,0 v 8.902"
style="fill:none;stroke:#000000;stroke-width:0.93203717;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12966"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>
如您所见,路径的样式属性中有一个笔划宽度值。
有没有一种简单的不那么令人讨厌的“hack”方式来实现这一点?
解决方案
推荐阅读
- android - 当应用程序处于后台或关闭时,Android 应用程序中的本地通知不显示
- c# - 基于另一个属性连接一个属性的值
- javascript - Swiper 使用 Edge 和 Safari 在网格内溢出
- javascript - 如何更改 webpack 模块导出需要字符串?
- amazon-web-services - 如何使用 aws-cli 创建具有 AWS 托管策略的角色?
- apache-spark - 如何使用 Spark SQL Scala API(不是 SQL)检查 Hive 表是否为外部表
- flutter - 如何在没有包的情况下在 Flutter 中实现下拉列表?
- jquery - http_request_duration_seconds_sum / http_request_duration_seconds_count 显示 2 个图表
- cross-browser - Blob PDF 数据未在 IE 11 中呈现
- db2 - 获取 11424 行后,源限定符中的 Informatica SQL30081N 出现错误