2017-10-09 5 views
0

besoins de base:Svg avec des paramètres qui charge dans Qt

Je travaille sur une application Qt qui remplace les couleurs dans un svg.
Une bonne implémentation consiste à analyser le svgxml et à remplacer les couleurs par une bonne correspondance des couleurs.
Malheureusement, l'application doit fonctionner sur une plate-forme avec une vitesse et une mémoire très limitées, et charger le svg dans le QSvgRenderer à partir d'un xml (ou chaîne de texte) est extrêmement lent.
Donc - mon implémentation actuelle consiste à remplacer les occurrences hexadécimales connues couleurs dans le QByteArray chargé par le moteur de rendu.
Une grande limite - si je veux remplacer une couleur de remplissage avec une couleur de stylo, et ils correspondent, je me retrouve avec un blob cassé.
Une deuxième limitation: Je ne peux avoir que 2 couleurs définies, un remplissage et un stylo.

Ce que je voudrais:

Je veux être en mesure de créer un « paramétrés » svg, où je peux remplacer « color1 », « couleur2 », « color3 » défini en haut, avec tout ce les couleurs choisies par l'utilisateur.

Note - le svg doit être chargé par le QSvgRenderer, de sorte que les valeurs des paramètres ne peut pas être dans un ou à l'extérieur htmljs. Le svg doit être autonome ... sans exigence d'appelant externe.
Mais je peux remplacer dans le code la valeur du paramètre avant la charge.
Je veux juste être en mesure de remplacer les paramètres dans un seul emplacement, au lieu des valeurs réelles à l'intérieur du xml partout où ils se produisent.

Ce que j'ai essayé:

J'ai lu dans la documentation svg qu'il est possible de créer des valeurs paramétrées. Ceci est un exemple d'autant que je le comprends ...
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> 

Malheureusement Qt ne se charge pas et navigateurs faire apparaître comme erreur.

Deuxième exemple: de 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> 

Cette charge dans le navigateur correctement comme red, mais Qt charge avec blue - si clairement qu'il ne supporte pas la valeur du paramètre.

Existe-t-il une version possible de svg qui utilise des paramètres pouvant être pris en charge par Qt?
Quelqu'un peut-il aider à corriger l'un de mes exemples ou donner un exemple correct/meilleur?
Merci.

Version Qt: 4.8

Répondre

1

Il y a longtemps, très longtemps, lorsque certains SVG équarrisseurs ne prennent pas en charge des feuilles de style, je résolu ce problème avec des entités 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>