首页 > 其他分享 >重写QPushButton,使可通过设置icon,在不同状态的显示不同图标

重写QPushButton,使可通过设置icon,在不同状态的显示不同图标

时间:2022-11-21 10:12:21浏览次数:47  
标签:initStyleOption QIcon pOption QPushButton icon 图标

默认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

相关文章