在 Qt5 中对 QIcon 应用图形过滤器

Apply graphics filter to QIcon in Qt5

我正在尝试做一些令我惊讶的事情,但它比最初预期的要难得多。我有一个 32 位 png 的小位图资源,我想在将其着色为特定颜色后显示为图标。

我遇到了 QGraphicsEffect class 及其子项,但它不会工作,除非我设置一个整个场景图,这对我的目的来说有点矫枉过正(渲染不同颜色的 16x16 图标) .

我也在 Qt4 中遇到了 QPixmapFilter class 但我在 Qt5[= 中找不到任何参考资料25=]。被移除了吗?

此外,在 widget icons example 中可以看到明显有一些滤镜作用于图标,同时进行了色调和模糊处理。

那么我怎样才能在 Qt5 中完成这个简单的任务呢?

在找到更好的答案之前,我决定分享我最终使用的方法。 IMO 不是一个非常优雅的解决方案,但它确实有效。它保留了透明度,我已经测试过它也适用于 SVG 资源。

Qt5的Tint图标函数:

#include <QPainter>
#include <QPixmap>
#include <QImage>
#include <QGraphicsEffect>

QImage tint(QImage src, QColor color, qreal strength=1.0){
    if(src.isNull()) return QImage();
    QGraphicsScene scene;
    QGraphicsPixmapItem item;
    item.setPixmap(QPixmap::fromImage(src));
    QGraphicsColorizeEffect effect;
    effect.setColor(color);
    effect.setStrength(strength);
    item.setGraphicsEffect(&effect);
    scene.addItem(&item);
    QImage res(src);
    QPainter ptr(&res);
    scene.render(&ptr, QRectF(), src.rect() );
    return res;
}

用法:

QIcon ic(QPixmap::fromImage(tint(QImage("://icons/spider.svg"),QColor(192,0,0),1.0)));

这会从任意图形资源生成一个易于染色的 QIcon 实例。