默认QPushButton设置icon后,当鼠标hove或者press时,图标不会变更为对应状态的图片。通过重写按钮,设置图标值,实现不同状态对应不同图标
继承QPushButton并重绘按钮
重新赋值时只需要设置icon默认状态的值,QIcon查找图标时找不到对应状态的值会使用默认状态(normal)的值
// 重写initStyleOption函数,获取icon,根据不同状态重新给icon赋值
void CPushButton::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 CPushButton::paintEvent(QPaintEvent* pPaintEvent)
{
QStylePainter p(this);
QStyleOptionButton option;
initStyleOption(&option);
p.drawControl(QStyle::CE_PushButton, option);
}
在qss样式中设置图标
CPushButton
{
icon-size: 20px;
qproperty-icon: url(:/button_icon_normal.svg) normal, url(:/button_icon_hover.svg) active, url(:/button_icon_press.svg) selected, url(:/button_icon_disable.svg) disabled;
}
标签:initStyleOption,QIcon,pOption,QPushButton,icon,图标
From: https://www.cnblogs.com/fhaibing/p/16903513.html