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)
这是你在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)
由于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,但考虑到几乎所有提供图标的网站都以黑色提供图标,这非常简洁。
| 归档时间: |
|
| 查看次数: |
8525 次 |
| 最近记录: |