继承QPushButton并重绘按钮
重新赋值时只需要设置icon默认状态的值,QIcon查找图标时找不到对应状态的值会使用默认状态(normal)的值。
// 重写initStyleOption函数,获取icon,根据不同状态重新给icon赋值
void MyPushButton::initStyleOption(QStyleOptionButton* pOption) const
{
if (Q_NULLPTR == pOption)
{
return;
}
QPushButton::initStyleOption(pOption);
if (!pOption->icon.isNull())
{
// 按键:按下状态
if (pOption->state & QStyle::State_Sunken)
{
pOption->icon = pOption->icon.pixmap(pOption->iconSize, QIcon::Selected);
}
// 按键:鼠标停留状态
else if (pOption->state & QStyle::State_MouseOver)
{
pOption->icon = pOption->icon.pixmap(pOption->iconSize, QIcon::Active);
}
// 按键:禁止状态
else if (!(pOption->state & QStyle::State_Enabled))
{
pOption->icon = pOption->icon.pixmap(pOption->iconSize, QIcon::Disabled);
}
// 按键:正常状态(默认)
else
{
pOption->icon = pOption->icon.pixmap(pOption->iconSize, QIcon::Normal);
}
}
}
// 在paintEvent中调用自定义子类的initStyleOption覆盖父类的style
void MyPushButton::paintEvent(QPaintEvent* pPaintEvent)
{
QStylePainter p(this);
QStyleOptionButton option;
initStyleOption(&option);
p.drawControl(QStyle::CE_PushButton, option);
}