Svg,参数以Qt加载

  • 本文关键字:Qt 加载 参数 Svg qt svg
  • 更新时间 :
  • 英文 :


基本需求:

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

我想要什么:

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

注意-svg必须由QSvgRenderer加载,因此参数值不能在外部htmljs
svg必须是自包含的。。。没有外部呼叫者要求
但是我可以在加载之前在代码中替换参数值
我只想能够替换单个位置中的参数,而不是xml中出现的所有实际值。

我尝试过的:

我在svg文档中读到,可以创建参数化值。据我所知,这是一个例子…
w3.org示例

<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:在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可以支持的参数
有人能帮我修正其中一个例子,或者给出一个正确/更好的例子吗
谢谢。

Qt版本:4.8

很久很久以前,当一些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>

最新更新