在qt中更改svg的颜色

cha*_*m15 11 c++ qt svg

我有一个svg加载资源,但它是黑色的.如何将颜色更改为白色?

ipe*_*rov 8

pyqt5的解决方案。您可以轻松地将其转换为 c++

def QIcon_from_svg(svg_filepath, color='black'):
    img = QPixmap(svg_filepath)
    qp = QPainter(img)
    qp.setCompositionMode(QPainter.CompositionMode_SourceIn)
    qp.fillRect( img.rect(), QColor(color) )
    qp.end()
    return QIcon(img)
Run Code Online (Sandbox Code Playgroud)


Jua*_*gos 6

这是你在Qt中如何做到这一点,别忘了将xml和svg模块添加到你的qt项目(*.pro文件).此代码段通过修改任何"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看来这行不通,因为在qt5中doc.documentElement()返回一个“只读”对象。对其进行更改根本不起作用。 (2认同)

Jer*_*ner 5

由于SVG格式是基于XML的,而XML只是ASCII文本...您可以将SVG资源加载到QString中,调用QString :: replace("\"#000000 \"","\"#ffffff \" "),然后将修改后的QString传递给QSVGRenderer.


小智 5

如果你的 SVG 是黑色的,有一个非常简单的方法:QGraphicsEffect

#include <QGraphicsItem>
#include <QGraphicsColorizeEffect>

QGraphicsItem *item;
QGraphicsColorizeEffect *effect;    

item = new QGraphicsItem;
effect = new QGraphicsColorizeEffect;

effect->setColor(Qt::white);
effect->setStrength(1);

item->setGraphicsEffect(effect)    
Run Code Online (Sandbox Code Playgroud)

这不适用于白色 SVG,但考虑到几乎所有提供图标的网站都以黑色提供图标,这非常简洁。