qt

2013-02-27 6 views
9

में एक svg का रंग बदलें मेरे पास संसाधनों में एक svg लोड है, लेकिन यह काला है। मैं रंग को सफेद कैसे बदलूं?qt

उत्तर

5

इस तरह आप इसे क्यूटी में कर सकते हैं, अपने 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); 
    } 
} 
+1

ऐसा लगता है कि यह काम नहीं करता है क्योंकि qt5 doc.documentElement() में "केवल पढ़ने" ऑब्जेक्ट देता है। इसमें बदलाव करना बिल्कुल काम नहीं करता है। –

2

जब तक आप मैक पर इसकी आवश्यकता नहीं है के रूप में, यह काम करना चाहिए:

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 प्रभाव।

आशा है कि मदद करता है।

+0

Lol, मैं पूरी QGraphicsEffects ने काट लिया गया है और अधिक एक बार :( – chacham15

+0

आप एक QGraphicsView में यह प्रतिपादन कोई आपत्ति नहीं है, तो QGraphicsEffects समर्थन किया जाना चाहिए की तुलना में मैक पर काम न। वहाँ भी तरीके हैं इसे QPixmap या QImage में प्रस्तुत करने के लिए, और उसके बाद इसे विभिन्न संरचना मोड के साथ प्रस्तुत करें। http://www.slideshare.net/qtbynokia/special-effects-with-qt-graphics-view इस स्लाइड में कुछ महान कोड नमूने हैं दिखाएं। – phyatt

+0

मुझे क्यूटी के नए निर्माण पर ग्राफिक्स प्रभाव की चीज़ को दोबारा जांचना चाहिए। मुझे लगता है कि उन्होंने इसे ठीक कर दिया होगा। इन दो लिंक के बीच लापता नोट देखें: http://qt-project.org/doc/qt-4.8 /qwidget.html#setGraphicsEffect और http://qt-project.org/doc/qt-5/qwidget.html#setGraphicsEffect ... यह अब नहीं कहता है 'नोट: ग्राफिक्स प्रभाव एक मैक पर समर्थित नहीं है, इसलिए वे विजेट के प्रतिपादन में कोई फर्क नहीं पड़ेगा। 'क्यूटी 5 के लिए। – phyatt

0

यदि सफेद केवल एकमात्र रंग है, तो एक साधारण समाधान मूल संपादक के रंग को एक छवि संपादक (जैसे इंकस्केप) के साथ बदलना होगा। बेशक, यदि आपको छवि को कई अलग-अलग रंगों के साथ उपयोग करने की आवश्यकता है, तो यह एक उचित समाधान नहीं होगा।

5

चूंकि एसवीजी प्रारूप एक्सएमएल आधारित है, और एक्सएमएल सिर्फ एएससीआईआईआई पाठ है ... आप एसवीजी संसाधन को क्यूस्ट्रिंग में लोड कर सकते हैं, क्यूस्ट्रिंग :: प्रतिस्थापित करें ("\" # 000000 \ "", "\" #ffffff \ ""), और उसके बाद संशोधित QString को अपने QSVGRenderer में पास करें।

संबंधित मुद्दे