找回密码
 立即注册
收起左侧

Qt编写自定义控件37-发光按钮(会呼吸的痛)

2
回复
6218
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2019-7-24 21:58:09 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一、前言
这个控件是好早以前写的,已经授权过好几个人开源过此控件代码,比如红磨坊小胖,此控件并不是来源于真实需求,而仅仅是突发奇想,类似于星星的闪烁,越到边缘越来越淡,定时器动态改变边缘发光的亮度,产生呼吸的效果,别名叫会呼吸的痛,看到这个歌名,又让我想起了前女友,哎!久久不能忘怀!
大致的原理就是使用了锥形渐变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、学习方法、写作技巧、热门技术、职场发展等内容,干货多多,福利多多!




回复

使用道具 举报

累计签到:467 天
连续签到:1 天
2019-7-25 11:33:53 显示全部楼层
怎么在qt  creator 里使用?

点评

可以仔细看SDK的使用说明!  详情 回复 发表于 2019-7-25 15:01
回复 支持 反对

使用道具 举报

累计签到:7 天
连续签到:1 天
2019-7-25 15:01:24 显示全部楼层
zyy890508 发表于 2019-7-25 11:33
怎么在qt  creator 里使用?

可以仔细看SDK的使用说明!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了