Qt 自定义按钮

按钮有三种状态:正常,鼠标滑过,鼠标左键按下,分别对应三张图片。


代码如下:

#ifndef IMAGEBUTTON_H
#define IMAGEBUTTON_H

#include <QPushButton>

class ImageButton : public QPushButton
{
    Q_OBJECT

public:
    explicit ImageButton(QWidget *parent = 0);
    void setImages(QString &normalName, QString &horverName, QString &pressName);

protected:
    virtual void enterEvent(QEvent *);
    virtual void leaveEvent(QEvent *);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    virtual void paintEvent(QPaintEvent *);

private:
    typedef enum {
        ST_INIT, ST_NORMAL, ST_HOVER, ST_PRESS, ST_COUNT
    } Status;
    Status curStatus_;
    QString imageName_[ST_COUNT];
};

#endif // IMAGEBUTTON_H


#include "imagebutton.h"
#include <QtWidgets>

ImageButton::ImageButton(QWidget *parent)
    : QPushButton(parent)
    , curStatus_(ST_INIT)
{
}

void ImageButton::setImages(QString &normalName, QString &horverName, QString &pressName)
{
    curStatus_ = ST_NORMAL;
    imageName_[ST_NORMAL] = normalName;
    imageName_[ST_HOVER] = horverName;
    imageName_[ST_PRESS] = pressName;
}

void ImageButton::enterEvent(QEvent *)
{
    if (curStatus_ == ST_INIT) {
        return;
    }

    curStatus_ = ST_HOVER;
    update();
}

void ImageButton::leaveEvent(QEvent *)
{
    if (curStatus_ == ST_INIT) {
        return;
    }

    curStatus_ = ST_NORMAL;
    update();
}

void ImageButton::mousePressEvent(QMouseEvent *event)
{
    if (curStatus_ == ST_INIT) {
        return;
    }

    if (event->button() == Qt::LeftButton) {
        curStatus_ = ST_PRESS;
        update();
    }
}

void ImageButton::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if (curStatus_ != ST_INIT) {
            curStatus_ = ST_HOVER;
            update();
        }
        // 鼠标在弹起的时候光标在按钮上才激发clicked信号
        if (rect().contains(event->pos())) {
            emit clicked();
        }
    }
}

void ImageButton::paintEvent(QPaintEvent *event)
{
    if (curStatus_ == ST_INIT) {
        QPushButton::paintEvent(event);
        return;
    }

    QPainter painter(this);
    QPixmap pixmap(imageName_[curStatus_]);
    painter.drawPixmap(rect(), pixmap);
}


用法:

1.如果不是用Qt Designer直接new一个ImageButton。

2.如果要关联到ui上的按钮,在按钮上右键单击“提升为...”,然后填写类名称:ImageButton和头文件imagebutton.h就可以了。

初始化的时候:

    ui->pushButton->setImages(QString(":/skin/close.png"),
                              QString(":/skin/close_hover.png"),
                              QString(":/skin/close_pressed.png"));


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值