2016-01-02 5 views
1

Я пытаюсь сделать что-то, что, к моему удивлению, было намного сложнее, чем предполагалось раньше. У меня есть небольшой растровый ресурс, который 32bit png, который я хотел бы отображать в виде значка после того, как он подтолкнул его к определенному цвету.Применить графический фильтр к QIcon в Qt5

Я столкнулся с классом QGraphicsEffect и его детьми, но это не сработает, если я не настроил весь график сцены, который является излишним для моей цели (отрисовка значка 16x16 в разных цветах).

я наткнулся QPixmapFilter класса в Qt4, но я не могу найти каких-либо ссылок на него в Qt5. Удалилось?

Также есть некоторые фильтры, работающие над значками, как показано на рисунке widget icons example, с обоими оттенками и размытиями.

Итак, как я могу выполнить эту простую задачу в Qt5?

ответ

0

Пока не поступит лучший ответ, я решил поделиться с ним тем, что я использовал. Это не ИМО очень изящное решение, но оно работает. Он сохраняет прозрачность, и я тестировал его для работы с ресурсами SVG.

Оттенок функция значок Qt5:

#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 экземпляр из произвольного графического ресурса.