我正在尝试做一件比最初预期的要困难得多的事情。我有一个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
实例。