在 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
实例。
我正在尝试做一些令我惊讶的事情,但它比最初预期的要难得多。我有一个 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
实例。