zoukankan      html  css  js  c++  java
  • Qt 自定义PushButton

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

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

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

     

    用法:

    1. loginButton = new PushButton(":/button/login_button_normal",  
    2.                              ":/button/login_button_hover",  
    3.                              ":/button/login_button_pressed");  


    或者:

    1. loginButton = new PushButton(":/button/login_button");  

    效果:


    具体实现:

    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. }  
  • 相关阅读:
    FTP和SSH的区别
    Hadoop之回收站
    什么是簇?
    linux中环境变量的配置
    windows系统中的系统变量和用户变量,以及配置JDK中各个参数的意义
    linux 中yum和rpm 总结
    ajax请求之async:false/true的作用
    JavaScript eval() 函数的用法
    js模式
    数组的一些操作
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648205.html
Copyright © 2011-2022 走看看