Ho un file svg caricato nelle risorse, ma è nero. Come posso cambiare il colore in bianco?Cambia il colore di uno svg in qt
risposta
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);
}
}
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.
Lol, sono stato morso da tutto il QGraphicsEffects non funzionano su Mac più di una volta :( – chacham15
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
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
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.
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.
- 1. Cambia dinamicamente il colore dell'immagine SVG in Android
- 2. Gnuplot - cambia colore di sfondo
- 3. Fabric.js - cambia colore/riempimento/tratto di svg importato
- 4. SVG - Cambia colore di riempimento al clic del pulsante
- 5. Cambia il colore di una QProgressBar
- 6. Cambia il colore del testo in MoreNavigationController
- 7. Cambia il colore del divisore di Spinner
- 8. Cambia il colore di sfondo di NSButton
- 9. cambia colore di sfondo
- 10. Cambia il colore del testo in android.R.layout.simple_list_item_2
- 11. Cambia il colore della sintassi in vim?
- 12. Cambia il colore della sottolineatura in Android
- 13. Cambia il colore del testo di UISegmentedControl
- 14. SVG: colore dell'ombra
- 15. Colore di sfondo del testo in SVG
- 16. Cambia colore di sfondo e colore carattere
- 17. Come impostare il colore di sfondo di uno svg D3.js?
- 18. Cambiare il colore dell'immagine SVG con javascript
- 19. Gnuplot cambia il colore delle barre nell'istogramma
- 20. Cambia colore tilde (~) in Vim
- 21. Cambia colore segnaposto in input
- 22. Cambia colore dell'immagine in javascript
- 23. Il mio SKLabelNode non cambia colore
- 24. Cambia colore pulsante in AlertDialog
- 25. Cambia colore tema in Runtime in Android
- 26. Qt: creazione di un "tasto immagine svg"
- 27. Elementi sovrapposti SVG colore sovrapposizione
- 28. come cambiare il colore dell'etichetta di testo QCheckBox in Qt?
- 29. Colore di sfondo predefinito dell'elemento radice SVG
- 30. Cambia colore di sfondo 'correzioni' in eclissi
Sembra che questo non funzioni perché in qt5 doc.documentElement() restituisce un oggetto di "sola lettura". Apportare modifiche ad esso non funziona affatto. –