2013-02-27 7 views

risposta

5

Ecco come è possibile farlo in Qt, non dimenticare di aggiungere i moduli xml e svg al progetto qt (file * .pro). Questo snippet di codice cambia il colore modificando l'attributo "fill" di qualsiasi elemento "percorso" ma è possibile utilizzarlo per modificare qualsiasi attributo di qualsiasi elemento.

void SetAttrRecur(QDomElement &elem, QString strtagname, QString strattr, QString strattrval); 

void ChangeSVGColor() 
{ 

    // open svg resource load contents to qbytearray 
    QFile file("myfile.svg"); 
    file.open(QIODevice::ReadOnly); 
    QByteArray baData = file.readAll(); 
    // load svg contents to xml document and edit contents 
    QDomDocument doc; 
    doc.setContent(baData); 
    // recurivelly change color 
    SetAttrRecur(doc.documentElement(), "path", "fill", "white"); 
    // create svg renderer with edited contents 
    QSvgRenderer svgRenderer(doc.toByteArray()); 
    // create pixmap target (could be a QImage) 
    QPixmap pix(svgRenderer.defaultSize()); 
    pix.fill(Qt::transparent); 
    // create painter to act over pixmap 
    QPainter pixPainter(&pix); 
    // use renderer to render over painter which paints on pixmap 
    svgRenderer.render(&pixPainter); 
    QIcon myicon(pix); 
    // Use icon ....  

} 


void SetAttrRecur(QDomElement &elem, QString strtagname, QString strattr, QString strattrval) 
{ 
    // if it has the tagname then overwritte desired attribute 
    if (elem.tagName().compare(strtagname) == 0) 
    { 
     elem.setAttribute(strattr, strattrval); 
    } 
    // loop all children 
    for (int i = 0; i < elem.childNodes().count(); i++) 
    { 
     if (!elem.childNodes().at(i).isElement()) 
     { 
      continue; 
     } 
     SetAttrRecur(elem.childNodes().at(i).toElement(), strtagname, strattr, strattrval); 
    } 
} 
+1

Sembra che questo non funzioni perché in qt5 doc.documentElement() restituisce un oggetto di "sola lettura". Apportare modifiche ad esso non funziona affatto. –

2

Finché non ne hai bisogno su Mac, questo dovrebbe funzionare:

http://doc-snapshot.qt-project.org/4.8/qwidget.html#setGraphicsEffect

http://doc-snapshot.qt-project.org/4.8/qgraphicscolorizeeffect.html

EDIT: O se è necessario supportare Mac, fare il rendering SVG e gli effetti all'interno di una QGraphicsView.

http://doc-snapshot.qt-project.org/4.8/qgraphicsitem.html#setGraphicsEffect

Imposta l'effetto Colorize per colorare di bianco, e impostarlo sul svgWidget.

Spero che questo aiuti.

+0

Lol, sono stato morso da tutto il QGraphicsEffects non funzionano su Mac più di una volta :( – chacham15

+0

Se non ti dispiace il rendering in una QGraphicsView, poi le QGraphicsEffects dovrebbero essere sostenute. Ci sono anche modi per renderlo a un QPixmap o QImage e quindi renderlo con diverse Modalità di composizione. http://www.slideshare.net/qtbynokia/special-effects-with-qt-graphics-view In questa diapositiva ci sono degli ottimi esempi di codice mostra – phyatt

+0

Dovrei controllare la cosa dell'effetto grafico sulle versioni più recenti di Qt. Penso che potrebbero averlo risolto. Guarda la nota mancante tra questi due collegamenti: http://qt-project.org/doc/qt-4.8 /qwidget.html#setGraphicsEffect e http://qt-project.org/doc/qt-5/qwidget.html#setGraphicsEffect ... non dice più 'Nota: effetti grafici a non è supportato su Mac, quindi non causerà alcuna differenza nel rendering del widget. per Qt 5. – phyatt

0

Se il bianco è l'unico colore necessario, una soluzione semplice sarebbe quella di cambiare il colore dell'immagine originale SVG con un editor di immagini (ad esempio Inkscape). Naturalmente, se hai bisogno di usare l'immagine con molti colori diversi, non sarà una soluzione ragionevole.

5

Poiché il formato SVG è basato su XML e XML è solo testo ASCII ... è possibile caricare la risorsa SVG in un QString, chiamare QString :: replace ("\" # 000000 \ "", "\" #ffffff \ ""), quindi passa QString modificato a QSVGRenderer.