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");
    loginButton = new PushButton(":/button/login_button_normal",
":/button/login_button_hover",
":/button/login_button_pressed");

或者:

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

效果:

具体实现:

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

Qt 自定义PushButton的更多相关文章

  1. Qt自定义插件编程小结

    qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...

  2. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  3. QSet使用及Qt自定义类型使用QHash等算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法     本文地址:http://techie ...

  4. Qt自定义标题栏

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt自定义标题栏     本文地址:http://techieliang.com/2017/1 ...

  5. Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  6. Qt中PushButton的pressed,released,clicked三种响应的区别

    Qt的PushButton的常用的三种响应有pressed,released和clicked. 优先级:pressed>released>clicked 按下按钮pressed函数的内容, ...

  7. Qt 自定义事件

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  8. qt 中的自定义pushbutton

  9. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

随机推荐

  1. iOS学习笔记(十七)——文件操作(NSFileManager)

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  2. POJ3090

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7094   Accepted: ...

  3. 1282 时钟(最小表示法+hash)

    1282 时钟 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N个时钟,每个时钟有M个指针,P个刻度.时钟是圆形的,P个刻度均分整 ...

  4. EasyNVR摄像机无插件直播进行摄像机云台控制的接入及调用详解

    EasyNVR云台接入及控制详解 摄像机云台控制在摄像机当中很常见摄像机能将当前状态下云台的水平角度.倾斜角度和摄像机镜头焦距等位置参数存储到设备中,需要时可以迅速调用这些参数并将云台和摄像头调整至该 ...

  5. JAVA性能调试+JProfiler使用相关

    一.JProfiler下载.安装与激活 1.1 下载 直接官网下载(https://www.ej-technologies.com/download/jprofiler/files) 建议下载9.X系 ...

  6. 关于webpack打包js和css

    废话不多说,直接贴出代码,大家瞅瞅:其中要引用css的话是要用css-loader.用了之后再webpack.config.js里面配置相应的代码,并且在相应的js文件里面引用即可啦,不知道有哪位大神 ...

  7. 转:使用awk命令获取文本的某一行,某一列

    1.打印文件的第一列(域)                 : awk '{print $1}' filename2.打印文件的前两列(域)                 : awk '{print ...

  8. SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据

    https://blog.csdn.net/yenange/article/details/50512312

  9. 于win2008R2虽然激活,但是一个小时之后就会自动强制关机的问题

    写一个批处理文件: taskkill /f /im wlms.exeping -n  4 127.0.0.1shutdown -a 用记事本写下以上的命令,另存为.bat 批处理文件.双击运行,即可. ...

  10. 免费的webservice接口

    快递查询接口 http://webservice.36wu.com/ExpressService.asmx ip查询接口 http://webservice.36wu.com/ipService.as ...