基本需求:
我正在使用Qt
应用程序替换svg
中的颜色
一个很好的实现是解析svg
xml
,并将颜色匹配的颜色替换为找到的颜色。
不幸的是,应用程序必须在速度和内存非常有限的平台上运行,并且svg
从QSvgRenderer
(或文本字符串)加载到xml
非常慢。
所以 - 我当前的实现是在渲染器加载的QByteArray
中用字符串替换十六进制 已知 颜色的出现次数。
一个很大的限制 - 如果我想用笔颜色替换填充颜色,并且它们匹配,我最终会得到一个破碎的blob。
第二个限制:我只能有2种定义的颜色,填充和笔。
我想要的是什么:
我希望能够创建一个"参数化的" svg,我可以替换" color1"," color2"," color3"使用用户选择的任何颜色在顶部定义。
注意 - svg
必须加载QSvgRenderer
,因此参数值不能位于html
或js
之外。
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
答案 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>