Pregunta Cambiar el color de un svg en qt


Tengo un svg cargado en los recursos, pero es negro. ¿Cómo cambio el color a blanco?


9
2018-02-27 22:16


origen


Respuestas:


Así es como puedes hacerlo en Qt, no olvides agregar los módulos xml y svg a tu proyecto qt (archivo * .pro). Este fragmento de código cambia el color al modificar el atributo "llenar" de cualquier elemento de "ruta", pero puede usarlo para modificar cualquier atributo de cualquier elemento.

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);
    }
}

5
2017-11-05 09:20



Como el formato SVG está basado en XML, y XML es solo texto ASCII ... puede cargar el recurso SVG en un QString, llame a QString :: replace ("\" # 000000 \ "", "\" # ffffff \ " "), y luego pase el QString modificado a su QSVGRenderer.


5
2018-02-28 07:43



Siempre que no lo necesites en Mac, esto debería funcionar:

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

http://doc-snapshot.qt-project.org/4.8/qgraphicscolorizeeffect.html

EDITAR: O si necesita admitir Mac, haga el renderizado svg y los efectos dentro de un QGraphicsView.

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

Configure su efecto de colorizar para colorearlo de blanco y configúrelo en svgWidget.

Espero que ayude.


2
2018-02-27 22:50



Si el blanco es el único color que necesita, entonces una solución simple sería cambiar el color de la imagen SVG original con un editor de imágenes (por ejemplo, Inkscape). Por supuesto, si necesita usar la imagen con muchos colores diferentes, esa no será una solución razonable.


0
2018-02-28 06:08