使用QIconEngine和透明度自定义QIcon
我试图在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;
};
这里是我的paint(...)的实现:
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 );
};
以下是我如何创建“组合”图标:
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(...)方法留空,该死的背景也在那里!)
有人知道如何使背景透明吗? 谢谢。
我解决了这个问题 问题是,重新实现的paint(...)方法几乎每次都通过pixmap(...)方法调用 - 也可以重新实现。 如果您保留默认实现,则此方法将创建新的QPixmap ,在其上创建QPainter ,并调用paint(...)以将此画家变为魔术师 。 但这就是问题 - 由于创建的QPixmap不包含Alpha通道,因此它不能半透明。 所以你需要像这样重新实现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() ,它将不透明。
链接地址: http://www.djcxy.com/p/82999.html