2017-10-09 37 views
0

基本需求:的SVG參數Qt中加載

我在Qt的應用程序,在svg替換顏色工作。
一個很好的實現方法是解析svgxml,並用顏色匹配替換顏色。
不幸的是,應用程序必須運行在速度和內存非常有限的平臺上,並且從xml(或文本字符串)將svg加載到QSvgRenderer中的速度非常慢。
所以 - 我目前的實現是字符串替換知顏色在QByteArray渲染器加載六角的發生。
一個很大的侷限性 - 如果我想用筆的顏色來替換填充顏色,並且它們匹配,那麼最終會出現破損的斑點。
第二個限制:我只能有2個定義的顏色,一個填充和一支筆。

我想什麼:

我希望能夠創造一個「參數」 SVG,在那裏我可以取代「顏色1」,「顏色2」,「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,但Qtblue加載它 - 那麼清楚它不支持的參數值。

是否存在的使用參數svg任何可能的版本,可以通過Qt支持?
有人可以幫助解決我的例子或給一個正確的/更好的例子嗎?
謝謝。

Qt版本:4。8

回答

1

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