Qt学习之路之自定义按钮

版权声明:!!!!禁止任何形式的复制与转载!!!! https://blog.csdn.net/HK_5788/article/details/42119281

首先,在此感谢博主:http://blog.sina.com.cn/liang19890820

按钮有三种状态:当鼠标点击的时候,当鼠标进入按钮的时候,当鼠标没有进入按钮的时候,这3个不同的状态。

上代码~~~~

pushBtn_widget.h 

/*
	贴图按钮的状态: 进入, 离开, 按下
*/


#ifndef PUSHBTNWIDGET_H
#define PUSHBTNWIDGET_H

#include <QPushButton>
#include <QPainter>
#include <QMouseEvent>

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()));

这里只是设置了按钮,但是没有指定按钮的位置。。

      这样就能打造自己喜欢的的按钮了


没有更多推荐了,返回首页