2013-02-27 10 views
9

リソースにsvgがロードされていますが、黒です。どのように色を白に変更するのですか?限り、あなたは、これは動作するはずです、Mac上でそれを必要としないようqt内のsvgの色を変更する

答えて

5

これはQtで行うことができます.xtプロジェクト(* .proファイル)にxmlとsvgモジュールを追加することを忘れないでください。このコードスニペットは、 "path"要素の "fill"属性を変更することで色を変更しますが、これを使用して任意の要素の属性を変更することができます。

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

EDIT:それともMacをサポートする必要がある場合、SVGレンダリングやエフェクトを行いますQGraphicsViewの内部にあります。

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

セットアップあなたの色付け効果は白、それを色、svgWidgetに設定します。

希望に役立ちます。

+0

笑、私は全体QGraphicsEffectsにかましてきた複数回のMac上で作業をいけない:( – chacham15

+0

あなたはQGraphicsViewにそれをレンダリングする気にしない場合は、QGraphicsEffectsがサポートされなければならない。やり方もあります。それをQPixmapまたはQImageにレンダリングしてから別の合成モードでレンダリングしてくださいhttp://www.slideshare.net/qtbynokia/special-effects-with-qt-graphics-viewこのスライドにはいくつかの素晴らしいコードサンプルがあります表示。 – phyatt

+0

Qtの新しいビルドでグラフィック効果を確認する必要があります。私はそれらが修正されている可能性があります。これらの2つのリンクの間の欠落しているノートを見てください:http://qt-project.org/doc/qt-4.8 /qwidget.html#setGraphicsEffectとhttp://qt-project.org/doc/qt-5/qwidget.html#setGraphicsEffect ...これはもはや '注:グラフィックスはMacではサポートされていないので、ウィジェットのレンダリングに何らの違いも生じません。Qt5の場合 – phyatt

0

白が唯一必要な色ならば、簡単な解決策はイメージエディタ(Inkscapeなど)で元のSVGイメージの色を変更することです。もちろん、さまざまな色の画像を使用する必要がある場合は、合理的な解決策にはなりません。

5

SVG形式はXMLベースでXMLはASCIIテキストなので、QStringにSVGリソースをロードしてQString :: replace( "\"#000000 \ ""、 "\" #ffffff \ "")、変更されたQStringをQSVGRendererに渡します。