作者:lf8762 | 来源:互联网 | 2023-09-04 19:51
首先,在此感谢博主:http:blog.sina.com.cnliang19890820按钮有三种状态:当鼠标点击的时候,当鼠标进入按钮的时候,当鼠标没有进入按钮的时候,这3个不同的状态。上代码
首先,在此感谢博主:http://blog.sina.com.cn/liang19890820
按钮有三种状态:当鼠标点击的时候,当鼠标进入按钮的时候,当鼠标没有进入按钮的时候,这3个不同的状态。
上代码~~~~
pushBtn_widget.h
/*
贴图按钮的状态: 进入, 离开, 按下
*/
#ifndef PUSHBTNWIDGET_H
#define PUSHBTNWIDGET_H
#include
#include
#include
class PushBtnWidget : public QPushButton
{
Q_OBJECT
public:
explicit PushBtnWidget(QWidget *parent = 0);
void setPixButtonName(QString pushBtnName);
protected:
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *);
void mouseReleaseEvent(QMouseEvent *event);
private:
//---------------> 按钮几种按钮状态
enum btnStatus{NORMAL, ENTER, PRESS, NOSTATUS};
btnStatus pushBtnStatus;
QString pix_Name;
int btnWidth;// 按钮宽度
int btnHeight;// 按钮高度
bool mouse_press;// 鼠标左键是否按下
};
#endif//PUSHBTNWIDGET_H
pushBtn_widget.
cpp
#include "pushBtn_widget.h"
PushBtnWidget::PushBtnWidget(QWidget *parent /*= 0*/)
:QPushButton(parent)
{
pushBtnStatus = NORMAL;// 初始化 按钮的图标状态
mouse_press = false;// 设置鼠标没有按下
}
/*
函数名:setPixButtonName
函数参数:QString pushBtnName
函数返回值: 无
*/
void PushBtnWidget::setPixButtonName(QString pushBtnName)
{
this->pix_Name = pushBtnName;
setFixedSize(QPixmap(pix_Name).size());
}
/*
函数名:enterEvent
函数参数:QEvent *event
函数返回值: 无
*/
void PushBtnWidget::enterEvent(QEvent *event)
{
pushBtnStatus = ENTER;
update();// -- 更新鼠标的状态
}
/*
函数名:leaveEvent
函数参数:QEvent *event
函数返回值: 无
*/
void PushBtnWidget::leaveEvent(QEvent *)
{
pushBtnStatus = NORMAL;
update();
}
/*
函数名:mousePressEvent
函数参数:QMouseEvent *event
函数返回值: 无
*/
void PushBtnWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)//-------点击鼠标的左键
{
mouse_press = true;
pushBtnStatus = PRESS;
update();
}
}
/*
函数名: paintEvent
函数参数:QPaintEvent *event
函数返回值: 无
*/
void PushBtnWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPixmap pixmap;
switch (pushBtnStatus)
{
case NORMAL:
{
pixmap.load(pix_Name);
break;
}
case ENTER:
{
pixmap.load(pix_Name + QString("_hover"));
break;
}
case PRESS:
{
pixmap.load(pix_Name + QString("_press"));
}
case NOSTATUS:
{
pixmap.load(pix_Name );
break;
}
default:
{
pixmap.load(pix_Name);
}
break;
}
painter.drawPixmap(rect(), pixmap);
}
/*
函数名: mouseReleaseEvent
函数参数:QMouseEvent *event
函数返回值: 无
*/
void PushBtnWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (mouse_press && this->rect().contains(event->pos()))
{
mouse_press = false;
pushBtnStatus = ENTER;
update();
emit clicked();
}
}
说明:
准备好按钮3张图片,在添加按钮资源的时候,图片重命名如下图:
例如:
PushBtnWidget *closePixBtn;
PushBtnWidget *sendPixBtn;
closePixBtn = new PushBtnWidget(this);
sendPixBtn = new PushBtnWidget(this);
closePixBtn->setPixButtonName(":/pixbtn/closeBtn");
sendPixBtn->setPixButtonName(":/pixbtn/sendBtn");
connect(closePixBtn, SIGNAL(clicked()), qApp, SLOT(quit()));//---按钮信号
connect(sendPixBtn, SIGNAL(clicked()), this, SLOT(slotSendMsg()));
这里只是设置了按钮,但是没有指定按钮的位置。。
这样就能打造自己喜欢的的按钮了