Qt 自定义PushButton

来源:互联网 发布:sql数据库计算机管理 编辑:程序博客网 时间:2024/05/16 05:23

http://blog.csdn.net/zddblog/article/details/11116191

功能:鼠标弹起并在按键区域内时,按键响应。并实现normal、hover、pressed效果,PushButton大小默认为传入图片大小。

PushButton的normal、hover、pressed效果没有使用QSS实现,因为重写mouseReleaseEvent后,qss的hover效果混乱。

 

用法:

[cpp] view plaincopyprint?
  1. loginButton = new PushButton(":/button/login_button_normal",  
  2.                              ":/button/login_button_hover",  
  3.                              ":/button/login_button_pressed");  


或者:

[cpp] view plaincopyprint?
  1. loginButton = new PushButton(":/button/login_button");  

 

效果:


具体实现:

[cpp] view plaincopyprint?
  1. #include "pushbutton.h"   
  2.   
  3. #include <QPainter>   
  4. #include <QMouseEvent>   
  5. #include <QFontMetrics>   
  6. #include <QLabel>   
  7.   
  8. PushButton::PushButton(QString normal, QString hover, QString pressed, QWidget *parent) :  
  9.     QPushButton(parent)  
  10. {  
  11.     buttonState = Normal;  
  12.   
  13.     normalPixmap.load(normal);  
  14.     hoverPixmap.load(hover);  
  15.     pressPixmap.load(pressed);  
  16.   
  17.     this->setFixedSize(normalPixmap.size());  
  18.   
  19.     this->setContentsMargins(0, 0, 0, 0);  
  20. }  
  21.   
  22. PushButton::PushButton(QString background, QWidget *parent) :  
  23.     QPushButton(parent)  
  24. {  
  25.     buttonState = Normal;  
  26.   
  27.     normalPixmap.load(background);  
  28.     hoverPixmap.load(background);  
  29.     pressPixmap.load(background);  
  30.   
  31.     this->setFixedSize(normalPixmap.size());  
  32.   
  33.     this->setContentsMargins(0, 0, 0, 0);  
  34. }  
  35.   
  36. void PushButton::paintEvent(QPaintEvent *)  
  37. {  
  38.     QPainter painter(this);  
  39.   
  40.     switch(buttonState)  
  41.     {  
  42.     case Normal:  
  43.         painter.drawPixmap(this->rect(), normalPixmap);  
  44.         break;  
  45.     case Hover:  
  46.         painter.drawPixmap(this->rect(), hoverPixmap);  
  47.         break;  
  48.     case Pressed:  
  49.         painter.drawPixmap(this->rect(), pressPixmap);  
  50.     }  
  51.   
  52.     painter.drawText(this->rect(), Qt::AlignCenter, this->text());  
  53. }  
  54.   
  55. void PushButton::enterEvent(QEvent *)  
  56. {  
  57.     buttonState = Hover;  
  58.     update();  
  59. }  
  60.   
  61. void PushButton::leaveEvent(QEvent *)  
  62. {  
  63.     buttonState = Normal;  
  64.     update();  
  65. }  
  66.   
  67. void PushButton::mousePressEvent(QMouseEvent *e)  
  68. {  
  69.     if(e->button() == Qt::LeftButton)  
  70.     {  
  71.         buttonState = Pressed;  
  72.         update();  
  73.     }  
  74. }  
  75.   
  76. bool isOnPushButton(const QPoint &point, const PushButton *pushButton)  
  77. {  
  78.     if(point.x() < 0 || point.x() > pushButton->width() ||  
  79.             point.y() < 0 || point.y() > pushButton->height())  
  80.     {  
  81.         return false;  
  82.     }  
  83.     return true;  
  84. }  
  85.   
  86. void PushButton::mouseReleaseEvent(QMouseEvent *e)  
  87. {  
  88.     if(e->button() == Qt::LeftButton)  
  89.     {  
  90.         //判断鼠标抬起时是否在PushButton之上   
  91.         if(isOnPushButton(e->pos(), this))  
  92.         {  
  93.             emit clicked();  
  94.         }  
  95.   
  96.         buttonState = Hover;  
  97.         update();  
  98.     }  
  99. }