में एक svg का रंग बदलें मेरे पास संसाधनों में एक svg लोड है, लेकिन यह काला है। मैं रंग को सफेद कैसे बदलूं?qt
qt
उत्तर
इस तरह आप इसे क्यूटी में कर सकते हैं, अपने qt प्रोजेक्ट (* .pro फ़ाइल) में xml और svg मॉड्यूल जोड़ने के लिए मत भूलना। यह कोड स्निपेट किसी भी "पथ" तत्व की "भरें" विशेषता को संशोधित करके रंग बदलता है लेकिन आप किसी तत्व के किसी भी विशेषता को संशोधित करने के लिए इसका उपयोग कर सकते हैं।
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);
}
}
जब तक आप मैक पर इसकी आवश्यकता नहीं है के रूप में, यह काम करना चाहिए:
http://doc-snapshot.qt-project.org/4.8/qwidget.html#setGraphicsEffect
http://doc-snapshot.qt-project.org/4.8/qgraphicscolorizeeffect.html
संपादित करें: या यदि आप मैक का समर्थन करने की जरूरत है, svg प्रतिपादन और प्रभाव करना एक QGraphicsView के अंदर।
http://doc-snapshot.qt-project.org/4.8/qgraphicsitem.html#setGraphicsEffect
सेटअप यह रंग करने के लिए सफेद, और svgWidget के लिए सेट अपने colorize प्रभाव।
आशा है कि मदद करता है।
Lol, मैं पूरी QGraphicsEffects ने काट लिया गया है और अधिक एक बार :( – chacham15
आप एक QGraphicsView में यह प्रतिपादन कोई आपत्ति नहीं है, तो QGraphicsEffects समर्थन किया जाना चाहिए की तुलना में मैक पर काम न। वहाँ भी तरीके हैं इसे QPixmap या QImage में प्रस्तुत करने के लिए, और उसके बाद इसे विभिन्न संरचना मोड के साथ प्रस्तुत करें। http://www.slideshare.net/qtbynokia/special-effects-with-qt-graphics-view इस स्लाइड में कुछ महान कोड नमूने हैं दिखाएं। – phyatt
मुझे क्यूटी के नए निर्माण पर ग्राफिक्स प्रभाव की चीज़ को दोबारा जांचना चाहिए। मुझे लगता है कि उन्होंने इसे ठीक कर दिया होगा। इन दो लिंक के बीच लापता नोट देखें: http://qt-project.org/doc/qt-4.8 /qwidget.html#setGraphicsEffect और http://qt-project.org/doc/qt-5/qwidget.html#setGraphicsEffect ... यह अब नहीं कहता है 'नोट: ग्राफिक्स प्रभाव एक मैक पर समर्थित नहीं है, इसलिए वे विजेट के प्रतिपादन में कोई फर्क नहीं पड़ेगा। 'क्यूटी 5 के लिए। – phyatt
यदि सफेद केवल एकमात्र रंग है, तो एक साधारण समाधान मूल संपादक के रंग को एक छवि संपादक (जैसे इंकस्केप) के साथ बदलना होगा। बेशक, यदि आपको छवि को कई अलग-अलग रंगों के साथ उपयोग करने की आवश्यकता है, तो यह एक उचित समाधान नहीं होगा।
चूंकि एसवीजी प्रारूप एक्सएमएल आधारित है, और एक्सएमएल सिर्फ एएससीआईआईआई पाठ है ... आप एसवीजी संसाधन को क्यूस्ट्रिंग में लोड कर सकते हैं, क्यूस्ट्रिंग :: प्रतिस्थापित करें ("\" # 000000 \ "", "\" #ffffff \ ""), और उसके बाद संशोधित QString को अपने QSVGRenderer में पास करें।
ऐसा लगता है कि यह काम नहीं करता है क्योंकि qt5 doc.documentElement() में "केवल पढ़ने" ऑब्जेक्ट देता है। इसमें बदलाव करना बिल्कुल काम नहीं करता है। –