在Qt5中将图形过滤器应用于QIcon



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

我遇到了QGraphicsEffect类及其子类,但除非我设置了一个整体场景图,否则它不会起作用,这对我的目的来说有点过头了(用不同的颜色渲染16x16图标)。

我在Qt4中也遇到了QPixmapFilter类,但在Qt5找不到任何引用。它被移除了吗?

此外,很明显,有一些过滤器在图标上工作,如小部件图标示例中所示,同时存在着色和模糊

那么,我如何在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实例。

相关内容

  • 没有找到相关文章

最新更新