按钮有三种状态:正常,鼠标滑过,鼠标左键按下,分别对应三张图片。
代码如下:
#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"));