Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果--三种实现方式

简介

本文介绍了Qt中的按钮实现响应鼠标悬浮、按下、松开后的效果,在三种状态下,按钮改变不同的背景图片。

方式1:通过设置setStyleSheet的方式去实现;

方式2:通过继承QPushButton去实现一个自定义的按钮;

方式3:在主界面中给按钮安装事件过滤器的方式去实现

程序

方式1:通过设置setStyleSheet的方式去实现;

    QPushButton *pButton= new QPushButton();
    QString styleSheet = QString("QPushButton{background:url(%1); background-color:transparent;border: none; }"  //正常
            "QPushButton:hover{background:url(%2); background-color:transparent; }"  //滑过
            "QPushButton:pressed{background:url(%3); background-color:transparent; }") //按下
            .arg(":/icons/images/c1.png")
            .arg(":/icons/images/c.png")
            .arg(":/icons/images/暂停.png");
        pButton->setStyleSheet(styleSheet);

 

方式2:通过继承QPushButton去实现一个自定义的按钮;

继承QPushButton类后,重写了event()方法

bool MyPushButton::event(QEvent *event)
{
    switch (event->type())
    {
    case QEvent::Enter:
        this->setIcon(QIcon(":/icons/images/c.png"));
        break;
    case QEvent::Leave:
        this->setIcon(QIcon(":/icons/images/c1.png"));
        break;
    case QEvent::MouseButtonPress:
        this->setIcon(QIcon(":/icons/images/暂停.png"));
        break;
    case QEvent::MouseButtonRelease:
        this->setIcon(QIcon(":/icons/images/c1.png"));
        break;
    default:
        break;
    }
    return QPushButton::event(event);
}

方式3:在主界面中给按钮安装事件过滤器的方式去实现

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    switch (event->type()) {
    case QEvent::HoverEnter:
        if(obj == pButton_)
            pButton_->setIcon(QIcon(":/icons/images/c1.png"));
        break;
    case QEvent::HoverLeave:
        if(obj == pButton_)
            pButton_->setIcon(QIcon(":/icons/images/c.png"));
        break;
    case QEvent::MouseButtonPress:
        if(obj == pButton_)
            pButton_->setIcon(QIcon(":/icons/images/暂停.png"));
        break;
    case QEvent::MouseButtonRelease:
        if(obj == pButton_)
            pButton_->setIcon(QIcon(":/icons/images/c1.png"));
        break;
    default:
        break;
    }
    return QWidget::eventFilter(obj, event);
}

总结

三种方式都能实现一个按钮在悬浮、按下、松开后显示不同的背景图片的效果。其中第一种方式实现起来最为简单,如果仅仅是按钮外观的切换,采用该方法最为合理,符合MVC设计理念;第二种方法和第三种方式更具有灵活性,但难度也相对较大,这两种方法常用来实现一些更特殊的按钮操作。

源码

完整的演示源码

链接:https://pan.baidu.com/s/1dQBj0hNUcI3sQ1BnehWtVw?pwd=ptty 
提取码:ptty

你可能感兴趣的:(Qt自定义图标,Qt,C++,qt,开发语言)