如何更改 svg 颜色并制作图标? (Qt、C++)

问题描述 投票:0回答:1
QIcon HmsUiHelper::createIconFromSvg(const QString& svgFilePath, const QColor& color, int width, int height)
{
    QSvgRenderer svgRenderer{ svgFilePath };
    
    QPixmap pixmap(width, height);
    pixmap.fill(Qt::transparent);
    
    QPainter painter{ &pixmap };
    painter.setRenderHint(QPainter::Antialiasing);
    
    painter.setBrush(QBrush{ color });    
    painter.setPen(Qt::NoPen);
    
    painter.scale(static_cast<double>(width) / svgRenderer.defaultSize().width(),
                  static_cast<double>(height) / svgRenderer.defaultSize().height());
    
    svgRenderer.render(&painter);
    
    return QIcon{ pixmap };
}

我有这个功能,但是当我尝试将结果图标设置为 QLineEdit 操作时,svg 图标不会改变颜色,但会改变大小。

问题是什么以及如何解决?

我尝试了 RenderHints 等的许多变体。我不想更改 svg 属性(我找到的某种解决方案)。我想使用

QSvgRenderer
更改 svg 颜色。

c++ qt svg
1个回答
0
投票
QIcon HmsUiHelper::createIconFromSvg(const QString& svgFilePath, const QColor& color, int width, int height)
{
    QSvgRenderer svgRenderer{ svgFilePath };
    
    QPixmap pixmap{ width, height };
    pixmap.fill(Qt::transparent);
    
    QPainter painter{ &pixmap };
    painter.setRenderHint(QPainter::Antialiasing);
    
    svgRenderer.render(&painter);
    
    QGraphicsScene scene;
    QGraphicsPixmapItem item{ pixmap };
    
    auto* colorizeEffect = new QGraphicsColorizeEffect{};
    colorizeEffect->setColor(color);
    item.setGraphicsEffect(colorizeEffect);
    scene.addItem(&item);
    
    QPixmap resultPixmap{ width, height };
    resultPixmap.fill(Qt::transparent);
    
    QPainter resultPainter{ &resultPixmap };
    scene.render(&resultPainter);
    
    return QIcon{ resultPixmap };
}

使用

QGraphicsColorizeEffect
的结果演示代码。 谢谢你musicamante

© www.soinside.com 2019 - 2024. All rights reserved.