У меня есть svg, загруженный в ресурсы, но он черный. Как изменить цвет на белый?
Измените цвет svg в qt
Ответ 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, скажем так, но создает цветной слой, который будет иметь ту же форму, что и ваш рисунок (при условии, что фон вашего рисунка прозрачен).