添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

这个控件是好早以前写的,已经授权过好几个人开源过此控件代码,比如红磨坊小胖,此控件并不是来源于真实需求,而仅仅是突发奇想,类似于星星的闪烁,越到边缘越来越淡,定时器动态改变边缘发光的亮度,产生呼吸的效果,别名叫会呼吸的痛,看到这个歌名,又让我想起了前女友,哎!久久不能忘怀!
大致的原理就是使用了锥形渐变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版本,如果用户需求量很大的话。

原文地址:http://www.qtcn.org/bbs/read-htm-tid-86005-ds-1.html