带有以Qt加载的参数的Svg

时间:2017-10-09 15:49:48

标签: qt svg

基本需求:

我正在使用Qt应用程序替换svg中的颜色 一个很好的实现是解析svg xml,并将颜色匹配的颜色替换为找到的颜色。
不幸的是,应用程序必须在速度和内存非常有限的平台上运行,并且svgQSvgRenderer(或文本字符串)加载到xml非常慢。
所以 - 我当前的实现是在渲染器加载的QByteArray中用字符串替换十六进制 已知 颜色的出现次数。
一个很大的限制 - 如果我想用笔颜色替换填充颜色,并且它们匹配,我最终会得到一个破碎的blob。
第二个限制:我只能有2种定义的颜色,填充和笔。

我想要的是什么:

我希望能够创建一个"参数化的" svg,我可以替换" color1"," color2"," color3"使用用户选择的任何颜色在顶部定义。

注意 - svg必须加载QSvgRenderer,因此参数值不能位于htmljs之外。
svg必须是自包含的......没有外部来电者的要求 但我可以在加载前用代码替换参数值 我只是希望能够在一个位置替换参数,而不是xml内的实际值。

我尝试了什么:

我在svg文档中读到可以创建参数化值。这是一个例子,就像我理解的那样......
w3.org example

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 110 40" width="100%" height="100%">
  <title>Reusable Button</title>
  <desc>Takes parameters from parent document's embedding element.</desc>

  <defs>
    <ref id="paramFill" param="color" default="blue"/>
    <ref id="paramText" param="text-label">button</ref>
    <ref id="paramStroke" param="outline" default="navy"/>
  </defs>

  <g>
    <rect id="button_rect" x="5" y="5" width="100" height="30" rx="15" ry="15" fill="url(#paramFill)" stroke="url(#paramStroke)" />
    <text id="button_label" x="55" y="30" text-anchor="middle" font-size="25" fill="black" font-family="Verdana">
      <tref xlink:href="#paramText" />
    </text>
  </g>

</svg>

不幸的是Qt没有加载它,浏览器显示为错误。

第二个例子:来自S.O: Define color in SVG

<?xml version="1.0"?>
<svg width="704" height="702" xmlns="http://www.w3.org/2000/svg">

<style>
.myfill { fill:red }
</style>

    <g fill="blue">
    <rect x="0" y="0" width="704" height="702" class="myfill" />
    </g>

</svg>

这在浏览器中正确加载red,但Qt加载blue - 显然它不支持参数值。

svg是否有可能使用Qt支持的<script type="text/javascript" src="/js/jquery.min.js"></script> 版本? 有人可以帮我修复我的例子或给出正确/更好的例子吗? 谢谢。

Qt版本:4.8

1 个答案:

答案 0 :(得分:2)

很久很久以前,当一些SVG渲染器不支持样式表时,我用XML实体解决了这个问题:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY red "#ff0000">
]>
<svg width="704" height="702" xmlns="http://www.w3.org/2000/svg">
    <g fill="blue">
         <rect x="0" y="0" width="704" height="702" fill="&red;" />
    </g>
</svg>