#ifndef M_H
#define M_H
#include
class B:public QPushButton{
Q_OBJECT
public: bool b; //用于存储鼠标光标进入或离开按钮的状态
bool press; //用于存储按钮是否被按下的状态
B(QString s,QWidget *p1=0):QPushButton(s,p1){ b=0; press=0;}
void mousePressEvent(QMouseEvent *e){ press=1; //保存按钮被按下的状态
update(); //更新按钮,此步不可缺少,否则按钮外观不会即时更新。 QPushButton::mousePressEvent(e);};
void mouseReleaseEvent(QMouseEvent *e){ press=0; //按钮未被按下
update(); QPushButton::mouseReleaseEvent(e); };
void enterEvent(QEvent *event){
b=1; //保存鼠标进入按钮的状态
update(); QPushButton::enterEvent(event); }
void leaveEvent(QEvent *event){
b=0; //鼠标离开按钮的状态
update(); QPushButton::leaveEvent(event); }
void paintEvent(QPaintEvent *e){ //自定义绘制按钮的外观
QPainter pr(this); QBrush bs(QColor(111,111,111)); //灰色
QPen pn(Qt::DotLine); //此画笔主要用于绘制焦点框
pn.setColor(QColor(1,111,1));
pn.setWidth(4); QRect r=rect(); //获取设置的按钮的大小。
if(b==0){ //若鼠标离开按钮
pr.fillRect(r,bs); //使用画刷 bs(灰色)填充按钮的背景,其大小为 r //绘制按钮上的文本,使用 text()函数获取设置的按钮的文本。
pr.drawText(r,Qt::AlignCenter,text());}
if(b==1){ pr.fillRect(r,QColor(111,1,1)); //红色背景
pr.drawText(r,Qt::AlignCenter,text()); }
if(b==1&&press==1){ //光标进入按钮且按钮被按下
pr.fillRect(r,QColor(222,222,222));
pr.drawText(r,Qt::AlignCenter,text());}
if(b==0&&press==0){ //光标离开按钮且按钮未被按下
pr.fillRect(r,bs); pr.drawText(r,Qt::AlignCenter,text());}
if(hasFocus()) {//按钮获得焦点 pr.setPen(pn);
pr.drawRect(r.adjusted(1,1,-2,-2)); } //绘制一个矩形边框
}
};
#endif // M_H
可以将pr.fillRect(r,bs);换成pr.drawPixmap(e->rect(), background);//QPixmap background;是图片
不想重写控件的话可以看重写样式的那篇内容(重写样式)