Qt之实现按钮正常(Normal)、滑过(Hover)、按下(Press)效果

     编程不仅仅是为了解决问题而存在,更多的是编出一个良好有用的API函数出来,为日后进行维护、拓展、可重用打下基础。

    要想实现按钮正常、滑过、按下的效果很简单,比如最小化、最大化、关闭按钮等,这需要用到用到Qt的鼠标事件、状态机、绘图事件,我继承了QPushButton,当然你想继承QWidget也是可以的,方法多样。

    鼠标事件:  

   void enterEvent(QEvent *);//进入事件
   void leaveEvent(QEvent *);//离开事件
   void mousePressEvent(QMouseEvent *event);  //鼠标按下事件
   void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件
    状态机:

   enum ButtonStatus{NORMAL, HOVER, PRESS};	//枚举按钮的几种状态
   ButtonStatus status;

     绘图事件:

   void paintEvent(QPaintEvent *);//按钮绘图事件

      以下直接给出源代码,可以直接作为API函数include到工程里使用。


pushbutton.h

//自定义按钮,实现Normal、Hover、Press
#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H
#include 
#include 
#include 
class PushButton:public QPushButton
{
    Q_OBJECT
public:
   explicit PushButton(QWidget *parent = 0);
   ~PushButton();
   void getIconPath(QString icon_path);//得到图片的路径名字,并且设置按钮为图片的大小
   void enterEvent(QEvent *);//进入事件
   void leaveEvent(QEvent *);//离开事件
   void mousePressEvent(QMouseEvent *event);  //鼠标按下事件
   void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件
   void paintEvent(QPaintEvent *);//按钮绘图事件

private:
   enum ButtonStatus{NORMAL, HOVER, PRESS};	//枚举按钮的几种状态
   ButtonStatus status;
   QString icon_path;//路径名
   bool mouse_press; //按钮左键是否按下
};
#endif // PUSHBUTTON_H



pushbutton.cpp

#include "pushbutton.h"
PushButton::PushButton(QWidget *parent)
    :QPushButton(parent)
{
    status = NORMAL;
    mouse_press = false;
}
PushButton::~PushButton()
{
}
void PushButton::getIconPath(QString Icon_path)
{
    this->icon_path = Icon_path;
    setFixedSize(QPixmap(Icon_path).size());//设置按钮与图片一样的大小
}

void PushButton::enterEvent(QEvent *)
{
    status = HOVER;
    update();
}
void PushButton::mousePressEvent(QMouseEvent *event)
{
    //若点击鼠标左键
    if(event->button() == Qt::LeftButton)
    {
        mouse_press = true;
        status = PRESS;
        update();
    }
}
void PushButton::mouseReleaseEvent(QMouseEvent *event)
{
    //若点击鼠标左键响应
    if(mouse_press&&this->rect().contains(event->pos()))
    {
        mouse_press = false;
        status = HOVER;
        update();
        emit clicked();
    }
}
void PushButton::leaveEvent(QEvent *)
{
    status = NORMAL;
    update();
}
void PushButton::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pixmap;
    switch(status)
    {
    case NORMAL:
        {
            pixmap.load(icon_path);
            break;
        }
    case HOVER:
        {
            pixmap.load(icon_path + QString("_hover"));
            break;
        }
    case PRESS:
        {
            pixmap.load(icon_path + QString("_press"));
            break;
        }
    default:
        pixmap.load(icon_path);
    }
    painter.drawPixmap(rect(), pixmap);
    painter.drawText(this->rect(), Qt::AlignCenter, this->text());
}



当然,要想作出高大上的漂亮效果,按钮的素材是必不可少的~~

     


你可能感兴趣的:(Qt,Qt,按钮效果)