PyQt: управление файлами svg для QGraphicsSvgItem - PullRequest
0 голосов
/ 06 мая 2020

Моя основная цель - изменить ширину обводки данного файла svg, но я не вижу встроенного метода для этого.

К сожалению, ширина жестко запрограммирована в файле svg, и моей первоначальной мыслью было буфер данные и отредактируйте их в памяти перед изменением визуализированного файла svg. Но это всего лишь дополнительные накладные расходы на обработку.

Затем я попытался преобразовать svg в структуру, подобную дереву доменов, но тогда мне, возможно, придется снова сохранить его перед загрузкой в ​​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>

Как видите, в атрибуте стиля есть значение ширины штриха для путь.

Есть ли более простой, менее неприятный "взломанный" способ достичь этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...