• 4104阅读
  • 0回复

Qt编写自定义控件59-直方动态图 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2019-09-24
一、前言
直方动态图类似于音乐播放时候的柱状图展示,顶部提供一个横线条,当柱状上升的时候,该线条类似于帽子的形式冲到顶端,相当于柱状顶上去的感觉,给人一种动态的感觉,听音乐的同时更加赏心悦目,原理比较简单,就是用2个定时器,一个定时器间隔比较短,负责快速把柱状图从底部冲到设置的值,同时横线条跟随一起冲上去,一个定时器负责慢慢的跌落值到0,然后横线条缓慢下降,下降速度比柱状图的速度要慢一些,产生一种对比的效果,看起来更像是跌落的感觉。

二、实现的功能
* 1:可设置最大值/最小值/当前值
* 2:可设置顶部滑块高度
* 3:可设置每次变动的步长
* 4:可设置item之间的间隔
* 5:可设置渐变的背景颜色
* 6:可设置柱状条颜色


三、效果图



四、头文件代码
  1. #ifndef WAVEBAR_H
  2. #define WAVEBAR_H
  3. /**
  4. * 直方动态图控件 作者:feiyangqingyun(QQ:517216493) 2016-11-6
  5. * 1:可设置最大值/最小值/当前值
  6. * 2:可设置顶部滑块高度
  7. * 3:可设置每次变动的步长
  8. * 4:可设置item之间的间隔
  9. * 5:可设置渐变的背景颜色
  10. * 6:可设置柱状条颜色
  11. */
  12. #include <QWidget>
  13. #ifdef quc
  14. #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
  15. #include <QtDesigner/QDesignerExportWidget>
  16. #else
  17. #include <QtUiPlugin/QDesignerExportWidget>
  18. #endif
  19. class QDESIGNER_WIDGET_EXPORT WaveBar : public QWidget
  20. #else
  21. class WaveBar : public QWidget
  22. #endif
  23. {
  24.     Q_OBJECT    
  25.     Q_PROPERTY(int minValue READ getMinValue WRITE setMinValue)
  26.     Q_PROPERTY(int maxValue READ getMaxValue WRITE setMaxValue)
  27.     Q_PROPERTY(int value READ getValue WRITE setValue)
  28.     Q_PROPERTY(double step READ getStep WRITE setStep)
  29.     Q_PROPERTY(int space READ getSpace WRITE setSpace)
  30.     Q_PROPERTY(int headHeight READ getHeadHeight WRITE setHeadHeight)
  31.     Q_PROPERTY(QColor bgColorStart READ getBgColorStart WRITE setBgColorStart)
  32.     Q_PROPERTY(QColor bgColorEnd READ getBgColorEnd WRITE setBgColorEnd)
  33.     Q_PROPERTY(QColor barColor READ getBarColor WRITE setBarColor)
  34. public:
  35.     explicit WaveBar(QWidget *parent = 0);
  36.     ~WaveBar();
  37. protected:
  38.     void resizeEvent(QResizeEvent *);
  39.     void paintEvent(QPaintEvent *);
  40.     void drawBg(QPainter *painter);
  41.     void drawBar(QPainter *painter);
  42.     void drawHead(QPainter *painter);
  43. private:    
  44.     int minValue;                   //最小值
  45.     int maxValue;                   //最大值
  46.     int value;                      //目标值
  47.     double step;                    //步长
  48.     int space;                      //间距
  49.     int headHeight;                 //顶部条块高度
  50.     QColor bgColorStart;            //背景渐变开始颜色
  51.     QColor bgColorEnd;              //背景渐变结束颜色
  52.     QColor barColor;                //柱状条颜色
  53.     int currentValue;               //当前值
  54.     double headY;                   //顶部条块Y轴坐标
  55.     double barY;                    //柱状条块Y轴坐标
  56.     QTimer *barTimer;               //柱状条块下降定时器
  57.     QTimer *headTimer;              //顶部条块下坠定时器
  58. private slots:
  59.     void updateBar();
  60.     void updateHead();
  61. public:    
  62.     int getMinValue()               const;
  63.     int getMaxValue()               const;
  64.     int getValue()                  const;
  65.     double getStep()                const;
  66.     int getSpace()                  const;
  67.     int getHeadHeight()             const;
  68.     QColor getBgColorStart()        const;
  69.     QColor getBgColorEnd()          const;
  70.     QColor getBarColor()            const;
  71.     QSize sizeHint()                const;
  72.     QSize minimumSizeHint()         const;
  73. public Q_SLOTS:
  74.     //设置范围值
  75.     void setRange(int minValue, int maxValue);
  76.     //设置最大最小值
  77.     void setMinValue(int minValue);
  78.     void setMaxValue(int maxValue);
  79.     //设置目标值
  80.     void setValue(int value);
  81.     //设置步长
  82.     void setStep(double step);
  83.     //设置间距
  84.     void setSpace(int space);
  85.     //设置顶部条块高度
  86.     void setHeadHeight(int headHeight);
  87.     //设置背景颜色
  88.     void setBgColorStart(const QColor &bgColorStart);
  89.     void setBgColorEnd(const QColor &bgColorEnd);
  90.     //设置柱状条颜色
  91.     void setBarColor(const QColor &barColor);
  92. };
  93. #endif // WAVEBAR_H

五、核心代码
  1. void WaveBar::paintEvent(QPaintEvent *)
  2. {
  3.     //绘制准备工作,启用反锯齿
  4.     QPainter painter(this);
  5.     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  6.     //绘制渐变背景
  7.     drawBg(&painter);
  8.     //绘制柱状条块
  9.     drawBar(&painter);
  10.     //绘制顶部条块
  11.     drawHead(&painter);
  12. }
  13. void WaveBar::drawBg(QPainter *painter)
  14. {
  15.     painter->save();
  16.     painter->setPen(Qt::NoPen);
  17.     QLinearGradient bgGradient(QPointF(0, 0), QPointF(0, height()));
  18.     bgGradient.setColorAt(0.0, bgColorStart);
  19.     bgGradient.setColorAt(1.0, bgColorEnd);
  20.     painter->setBrush(bgGradient);
  21.     painter->drawRect(rect());
  22.     painter->restore();
  23. }
  24. void WaveBar::drawBar(QPainter *painter)
  25. {
  26.     painter->save();
  27.     QRectF barRect(QPointF(space, barY), QPointF(width() - space, height() - space));
  28.     painter->setPen(Qt::NoPen);
  29.     painter->setBrush(barColor);
  30.     painter->drawRect(barRect);
  31.     painter->restore();
  32. }
  33. void WaveBar::drawHead(QPainter *painter)
  34. {
  35.     painter->save();
  36.     QRectF headRect(QPointF(space, headY), QPointF(width() - space, headY - headHeight));
  37.     painter->setPen(Qt::NoPen);
  38.     painter->setBrush(barColor);
  39.     painter->drawRect(headRect);
  40.     painter->restore();
  41. }
  42. void WaveBar::updateBar()
  43. {
  44.     barY += step;
  45.     //超过底部则停止
  46.     int bottomY = height() - space - headHeight;
  47.     if (barY >= bottomY) {
  48.         if (barTimer->isActive()) {
  49.             barTimer->stop();
  50.         }
  51.         barY = bottomY;
  52.     }
  53.     this->update();
  54. }
  55. void WaveBar::updateHead()
  56. {
  57.     headY += step;
  58.     //超过底部则停止
  59.     int bottomY = height() - space;
  60.     if (headY >= bottomY) {
  61.         if (headTimer->isActive()) {
  62.             headTimer->stop();
  63.         }
  64.         headY = bottomY;
  65.     }
  66.     this->update();
  67. }

欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个