Измените цвет svg в qt

У меня есть svg, загруженный в ресурсы, но он черный. Как изменить цвет на белый?

Ответ 1

Вот как вы можете это сделать в 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);
    }
}

Ответ 2

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

Ответ 3

Пока вам это не нужно на 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.

Надеюсь, что это поможет.

Ответ 4

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

Ответ 5

Вы можете использовать ColorOverlay, как описано в конце этого вопроса:

Qt QML LevelAdjust показывает странные эффекты края при применении к источнику SVG

Это не меняет SVG, скажем так, но создает цветной слой, который будет иметь ту же форму, что и ваш рисунок (при условии, что фон вашего рисунка прозрачен).