• 2642阅读
  • 6回复

Qt编写自定义控件37-发光按钮(会呼吸的痛) [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2019-07-24

一、前言
这个控件是好早以前写的,已经授权过好几个人开源过此控件代码,比如红磨坊小胖,此控件并不是来源于真实需求,而仅仅是突发奇想,类似于星星的闪烁,越到边缘越来越淡,定时器动态改变边缘发光的亮度,产生呼吸的效果,别名叫会呼吸的痛,看到这个歌名,又让我想起了前女友,哎!久久不能忘怀!
大致的原理就是使用了锥形渐变QRadialGradient,然后定时器改变该渐变画刷的颜色的透明度值,产生呼吸效果。Qt中提供了好多种渐变画刷,非常有用,可以执行画刷的区域,然后等比例插值,指定插值对应的颜色,这样使用起来就非常的丰富了。

二、实现的功能
* 1:可设置呼吸间隔
* 2:可设置颜色透明渐变步长
* 3:可设置背景颜色

三、效果图



四、头文件代码
  1. #ifndef LIGHTPOINT_H
  2. #define LIGHTPOINT_H
  3. /**
  4. * 呼吸点控件 作者:feiyangqingyun(QQ:517216493) 2017-11-27
  5. * 1:可设置呼吸间隔
  6. * 2:可设置颜色透明渐变步长
  7. * 3:可设置背景颜色
  8. */
  9. #include <QWidget>
  10. #ifdef quc
  11. #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
  12. #include <QtDesigner/QDesignerExportWidget>
  13. #else
  14. #include <QtUiPlugin/QDesignerExportWidget>
  15. #endif
  16. class QDESIGNER_WIDGET_EXPORT LightPoint : public QWidget
  17. #else
  18. class LightPoint : public QWidget
  19. #endif
  20. {
  21.     Q_OBJECT
  22.     Q_PROPERTY(int step READ getStep WRITE setStep)
  23.     Q_PROPERTY(int interval READ getInterval WRITE setInterval)    
  24.     Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
  25. public:
  26.     explicit LightPoint(QWidget *parent = 0);
  27.     ~LightPoint();
  28. protected:
  29.     void paintEvent(QPaintEvent *);
  30.     void drawBg(QPainter *painter);
  31. private:
  32.     int step;                       //颜色透明渐变步长
  33.     int interval;                   //定时器间隔    
  34.     QColor bgColor;                 //背景颜色
  35.     QTimer *timer;                  //绘制定时器
  36.     int offset;                     //偏移量
  37.     bool add;                       //是否增加
  38. public:
  39.     int getStep()                   const;
  40.     int getInterval()               const;    
  41.     QColor getBgColor()             const;
  42.     QSize sizeHint()                const;
  43.     QSize minimumSizeHint()         const;
  44. public slots:
  45.     //设置颜色透明渐变步长
  46.     void setStep(int step);
  47.     //设置定时器间隔
  48.     void setInterval(int interval);  
  49.     //设置背景颜色
  50.     void setBgColor(const QColor &bgColor);
  51. };
  52. #endif // LIGHTPOINT_H

五、完整代码
  1. #pragma execution_character_set("utf-8")
  2. #include "lightpoint.h"
  3. #include "qpainter.h"
  4. #include "qevent.h"
  5. #include "qtimer.h"
  6. #include "qdebug.h"
  7. LightPoint::LightPoint(QWidget *parent) : QWidget(parent)
  8. {
  9.     step = 10;
  10.     interval = 100;    
  11.     bgColor = QColor(255, 0, 0);
  12.     timer = new QTimer(this);
  13.     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
  14.     timer->start(100);
  15.     offset = 0;
  16.     add = true;
  17. }
  18. LightPoint::~LightPoint()
  19. {
  20.     if (timer->isActive()) {
  21.         timer->stop();
  22.     }
  23. }
  24. void LightPoint::paintEvent(QPaintEvent *)
  25. {
  26.     int width = this->width();
  27.     int height = this->height();
  28.     int side = qMin(width, height);
  29.     //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
  30.     QPainter painter(this);
  31.     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  32.     painter.translate(width / 2, height / 2);
  33.     painter.scale(side / 200.0, side / 200.0);
  34.     //绘制背景
  35.     drawBg(&painter);
  36. }
  37. void LightPoint::drawBg(QPainter *painter)
  38. {
  39.     int radius = 99;
  40.     painter->save();
  41.     QRadialGradient g(QPoint(0, 0), radius);
  42.     (offset < 70 && add) ? (offset += step) : (add = false);
  43.     (offset > 0 && !add) ? (offset -= step) : (add = true);
  44.     bgColor.setAlpha(255);
  45.     g.setColorAt(0.1, bgColor);
  46.     bgColor.setAlpha(100 + offset);
  47.     g.setColorAt(0.3, bgColor);
  48.     bgColor.setAlpha(50 + offset);
  49.     g.setColorAt(0.6, bgColor);
  50.     bgColor.setAlpha(0);
  51.     g.setColorAt(1.0, bgColor);
  52.     painter->setPen(Qt::NoPen);
  53.     painter->setBrush(g);
  54.     painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
  55.     painter->restore();
  56. }
  57. int LightPoint::getStep() const
  58. {
  59.     return this->step;
  60. }
  61. int LightPoint::getInterval() const
  62. {
  63.     return this->interval;
  64. }
  65. QColor LightPoint::getBgColor() const
  66. {
  67.     return this->bgColor;
  68. }
  69. QSize LightPoint::sizeHint() const
  70. {
  71.     return QSize(100, 100);
  72. }
  73. QSize LightPoint::minimumSizeHint() const
  74. {
  75.     return QSize(5, 5);
  76. }
  77. void LightPoint::setStep(int step)
  78. {
  79.     if (this->step != step) {
  80.         this->step = step;
  81.         update();
  82.     }
  83. }
  84. void LightPoint::setInterval(int interval)
  85. {
  86.     if (this->interval != interval) {
  87.         this->interval = interval;
  88.         timer->setInterval(interval);
  89.         update();
  90.     }
  91. }
  92. void LightPoint::setBgColor(const QColor &bgColor)
  93. {
  94.     if (this->bgColor != bgColor) {
  95.         this->bgColor = bgColor;
  96.         update();
  97.     }
  98. }

六、控件介绍
1. 超过149个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt  Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
6. 每个控件默认配色和demo对应的配色都非常精美。
7. 超过130个可见控件,6个不可见控件。
8. 部分控件提供多种样式风格选择,多种指示器样式选择。
9. 所有控件自适应窗体拉伸变化。
10.  集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
13. 所有控件最后生成一个dll动态库文件,可以直接集成到qtcreator中拖曳设计使用。
14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。


七、SDK下载
- SDK下载链接:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p
- 下载链接中包含了各个版本的动态库文件,所有控件的头文件,使用demo,自定义控件+属性设计器。
- 自定义控件插件开放动态库dll使用(永久免费),无任何后门和限制,请放心使用。
- 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
- 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
- widget版本(QQ:517216493)qml版本(QQ:373955953)三峰驼(QQ:278969898)。
- 涛哥的知乎专栏 Qt进阶之路 https://zhuanlan.zhihu.com/TaoQt
- 欢迎关注微信公众号【高效程序员】,C++/Python、学习方法、写作技巧、热门技术、职场发展等内容,干货多多,福利多多!
  
4条评分好评度+1贡献值+1金钱+5威望+1
林fiume 好评度 +1 - 2019-12-03
林fiume 贡献值 +1 - 2019-12-03
林fiume 威望 +1 - 2019-12-03
林fiume 金钱 +5 - 2019-12-03
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
在线clickto

只看该作者 1楼 发表于: 2019-07-24
很明显,此贴是为了纪念前女友的,鉴定完毕。
离线305750665

只看该作者 2楼 发表于: 2019-07-25
很明显,此贴是为了纪念前女友的,鉴定完毕。
雨田哥: 群号:853086607
QQ: 3246214072

刘典武-feiyangqingyun:专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!QQ:517216493
在线boylebao

只看该作者 3楼 发表于: 2019-07-25
此处应@刘大嫂
为Qt打造具有强大生产力的软件。
离线fzw003

只看该作者 4楼 发表于: 2019-07-25
看来老刘的前女友有眼无珠。看走眼了。666
离线llwj0303

只看该作者 5楼 发表于: 2019-08-01
得不到的永远在骚动
专注C++,专注Qt
离线zzzzzzhuzhu

只看该作者 6楼 发表于: 2019-08-02
爱是一道光,绿到你发慌
快速回复
限100 字节
 
上一个 下一个