2013-02-27 4 views

ответ

5

Как вы можете это сделать в Qt, не забудьте добавить модули xml и svg в проект qt (* .pro-файл). Этот фрагмент кода изменяет цвет, изменяя атрибут «fill» любого элемента «path», но вы можете использовать его для изменения любого атрибута любого элемента.

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

До тех пор, пока вы не нужны на Mac, это должно работать:

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 В этом слайде есть отличные примеры кода show – phyatt

+0

Я должен дважды проверить действие графического эффекта на новых строках Qt. Думаю, они, возможно, исправили его. Посмотрите на недостающую ноту между этими двумя ссылками: http://qt-project.org/doc/qt-4.8 /qwidget.html#setGraphicsEffect и http://qt-project.org/doc/qt-5/qwidget.html#setGraphicsEffect ... он больше не говорит 'Примечание: Графические эффекты re не поддерживается на Mac, поэтому они не будут вызывать каких-либо различий в рендеринге виджета. 'для Qt 5. – phyatt

0

Если вам нужен только белый цвет, то простым решением было бы изменить цвет исходного изображения SVG с помощью редактора изображений (например, Inkscape). Конечно, если вам нужно использовать изображение со множеством разных цветов, это не будет разумным решением.

5

Поскольку формат SVG основан на XML, а XML - это просто текст ASCII ... вы можете загрузить ресурс SVG в QString, вызовите QString :: replace ("\" # 000000 \ "", "\" #ffffff \ ""), а затем передать измененный QString в ваш QSVGenderer.

Смежные вопросы