Я пытаюсь реализовать что-то вроде «составной иконки» в Qt.
Цель: Мне нужно динамически установить цвет только для части иконы.
Моя идея: Составьте эту иконку двумя другими. Один значок, который будет окрашен по желанию (возможно, ColorizeEffect) и смешать его под вторым значком, который действует как слой наложения.
Выпуск: Я старался QIconEngine и реализации его покрасить метод. ColorizeEffect, кажется, не работает (даже когда я пытаюсь взломать временный QLabel для этого — когда сила установлена> 0,0, QIcon, образованный этим, пуст). Но это не главная проблема. Дело в том, что независимо от того, что я делаю, я получаю цветной фон по умолчанию для этого «составного» значка.
Вот фрагмент моего кода:
class QComposedIconEngine: public QIconEngine
{
public:
QComposedIconEngine();
~QComposedIconEngine();
virtual void paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state );
virtual QIconEngine * clone(void) const;
public:
QIcon m_qIconA;
QIcon m_qIconB;
QColor m_qColor;
};
И вот моя реализация краски (…):
void CLxQComposedIconEngine::paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state )
{
QBrush brush = painter->background();
QColor color = brush.color();
brush.setColor( Qt::transparent );
painter->setBackground( brush );
painter->eraseRect( rect );
painter->setCompositionMode( QPainter::CompositionMode_SourceOver );
m_qIconA.paint( painter, rect, Qt::AlignCenter, mode, state );
};
И вот как я создаю эту иконку «Composed»:
QComposedIconEngine * qIconEngine = new QComposedIconEngine();
QIcon i1;
QIcon i2;
i1.addPixmap(...);
i2.addPixmap(...);
qIconEngine->m_qIconA = i1;
qIconEngine->m_qIconB = i2;
QIcon i3( qIconEngine );
Я ожидаю, что i1 и i3 будут выглядеть одинаково. И кроме чертового фона это действительно так.
Но мне нужно сделать это прозрачным.
(даже когда я оставляю свой метод paint (…) пустым, чертов фон есть!)
Кто-нибудь знает, как сделать фон прозрачным?
Благодарю.
Я решил это. Проблема была в том, что переопределено покрасить(…) метод почти каждый раз вызывается через пиксельная (…) метод — который тоже может быть переопределён. Если вы оставите реализацию по умолчанию, этот метод создаст новый QPixmap, создает QPainter на это и звонит покрасить(…) охота на этого художника. Но это проблема — поскольку созданная QPixmap не содержит альфа-канала, она не может быть полупрозрачной.
Поэтому вам нужно переопределить метод pixmap (…) следующим образом:
QPixmap CLxQComposedIconEngine::pixmap ( const QSize & size, QIcon::Mode mode, QIcon::State state )
{
QImage img( size, QImage::Format_ARGB32 );
img.fill(qRgba(0,0,0,0));
QPixmap pix = QPixmap::fromImage(img, Qt::NoFormatConversion );
{
QPainter painter ( &pix );
QRect r( QPoint(0.0,0.0), size );
this->paint(&painter, r, mode, state);
}
return pix;
};
Ключом являются первые два ряда … Без img.fill () это было бы не прозрачно.