效果:

代码:
h文件

#ifndef WAVEPROGRESSBAR_H
#define WAVEPROGRESSBAR_H#include <QWidget>
#include <QPainter>
#include <QtMath>class WaveProgressBar : public QWidget
{Q_OBJECT
public:explicit WaveProgressBar(QWidget *parent = 0);enum Style_Type{eStyle_Rect = 0,//矩形eStyle_Circle,//圆};//进度值void setValue(int value) {m_value = value;}int value() {return m_value;}//最大值void setMaxValue(int value) {m_maxValue = value;}int maxValue() {return m_maxValue;}//最小值void setMinValue(int value) {m_minValue = value;}int minValue() {return m_minValue;}//设置外框形状void setPercentStyle(WaveProgressBar::Style_Type type) {m_percentStyle = type;}Style_Type percentStyle() {return m_percentStyle;}//设置水波密度(周期)void setWaterDensity(int val) {m_waterDensity = val;}int waterDensity() {return m_waterDensity;}//设置水体颜色void setColor(QColor col) {m_usedColor = col;}QColor color() {return m_usedColor;}//设置水波高度(幅值)void setWaterHeight(double val) {m_waterHeight = val;}double waterHeight() {return m_waterHeight;}//设置边界宽度void setBorderWidth(int val) {m_borderWidth = val;}int borderWidth() {return m_borderWidth;}//设置边框圆角void setRound(int round){m_round = round;}//设置字体颜色void setTextColor(QColor col) {m_textColor = col;}QColor textColor() {return m_textColor;}//设置字体边框颜色void setBoderColor(QColor col) {m_boderColor = col;}QColor boderColor() {return m_boderColor;}//设置背景颜色void setBgColor(QColor col) {m_bgColor = col;}QColor bgColor() {return m_bgColor;}//设置刷新间隔,越小刷新速度越快,cpu消耗越大void setUpdateTime(int time){m_updateTime = time;this->startTimer(m_updateTime);}//设置波浪移动速度void setSpeed(int speed){m_speed = speed;}protected:void paintEvent(QPaintEvent *event);void timerEvent(QTimerEvent *event);
private:Style_Type m_percentStyle = eStyle_Rect;   //边框类型int m_borderWidth = 0;                                  //边框宽度QColor m_boderColor = QColor(0,0,0,80);                 //边框颜色int m_round = 5;                                        //边框圆角QColor m_usedColor = QColor(180,255,255);               //水体颜色QColor m_textColor = Qt::white;                         //字体颜色QColor m_bgColor = Qt::gray;                            //背景颜色int m_updateTime = 100;         //水波波动速度,越大越慢int m_waterDensity = 5;         // 水波的密度double m_waterHeight = 0.02;    //水波高度double m_offset = 50;           //水波相位差double m_speed = 0.4;           //一次刷新的位移,可代表波浪移动速度QFont m_font;       //字体,默认大小为控件大小的1/4int m_value = 66;int m_minValue = 0;int m_maxValue = 100;
};#endif // WAVEPROGRESSBAR_H

cpp文件

#include "waveprogressbar.h"WaveProgressBar::WaveProgressBar(QWidget *parent) : QWidget(parent)
{m_font.setFamily("Microsoft YaHei");this->startTimer(m_updateTime);
}void WaveProgressBar::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);  // 反锯齿;int height = this->height();int width = this->width();int side = qMin(width, height);//计算当前值所占百分比double percent = 1 - (double)(m_value - m_minValue) / (m_maxValue - m_minValue);//正弦曲线公式 y = A * sin(ωx + φ) + kdouble w = m_waterDensity * M_PI / width;   //w表示周期,可以理解为水波的密度,值越大密度越大(浪越密集 ^_^),取值 密度*M_PI/宽度double A = height * m_waterHeight;  //A表示振幅,可以理解为水波的高度,值越大高度越高(越浪 ^_^),取值高度的百分比double k = height * percent;    //k表示y轴偏移,可以理解为进度,取值高度的进度百分比QPainterPath waterPath1;    //第一条波浪路径集合QPainterPath waterPath2;    //第二条波浪路径集合//移动到左上角起始点waterPath1.moveTo(0, height);waterPath2.moveTo(0, height);m_offset += m_speed;if (m_offset > (width / 2))m_offset = 0;//计算路劲for(int x = 0; x <= width; x++){double waterY1 = (double)(A * sin(w * x + m_offset)) + k; //第一条波浪Y轴double waterY2 = (double)(A * sin(w * x + m_offset + (width / 2 * w))) + k; //第二条波浪Y轴if (m_value == m_minValue)   //如果当前值为最小值则Y轴为高度{waterY1 = height;waterY2 = height;}if (m_value == m_maxValue)  //如果当前值为最大值则Y轴为0{waterY1 = 0;waterY2 = 0;}waterPath1.lineTo(x, waterY1);waterPath2.lineTo(x, waterY2);}//移动到右下角结束点,整体形成一个闭合路径waterPath1.lineTo(width, height);waterPath2.lineTo(width, height);//大路径QPainterPath bigPath;if(m_borderWidth <= 0)painter.setPen(Qt::NoPen);elsepainter.setPen(m_boderColor);painter.setBrush(m_bgColor);if (m_percentStyle == eStyle_Rect){painter.setBrush(m_bgColor);painter.drawRoundRect(m_borderWidth, m_borderWidth, width, height,5,5);bigPath.addRoundRect(m_borderWidth, m_borderWidth, width, height,5,5);}else if (m_percentStyle == eStyle_Circle){side = side - m_borderWidth * 2;painter.drawEllipse((width - side) / 2, m_borderWidth, side, side);bigPath.addEllipse((width - side) / 2, m_borderWidth, side, side);}//新路径,用大路径减去波浪区域的路径,形成遮罩效果QPainterPath path;//第一条波浪挖去后的路径m_usedColor.setAlpha(100);path = bigPath.intersected(waterPath1);painter.setPen(Qt::NoPen);painter.setBrush(m_usedColor);painter.drawPath(path);//第二条波浪挖去后的路径m_usedColor.setAlpha(180);path = bigPath.intersected(waterPath2);painter.setBrush(m_usedColor);painter.drawPath(path);//绘制文字m_font.setPixelSize(side/4);painter.setPen(m_textColor);painter.setFont(m_font);painter.drawText(this->rect(), Qt::AlignCenter, QString("%1%").arg(m_value));
}void WaveProgressBar::timerEvent(QTimerEvent *event)
{Q_UNUSED(event);this->update();
}

qt水波进度控件设计相关推荐

  1. Qt Creator 窗体控件自适应窗口大小布局

    常见的软件窗口大小改变(最大化.手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的.网上百度了很多,多数说的很含糊,还有 ...

  2. QT自定义Widget控件及其使用

    今天来给大家分享一下QT自定义widget控件及其使用,当ui设计器提供的界面不满足实际需求时,可以从QWidget继承自定义的界面组件.有两种方法一种是提升法,另一种是ui设计器自定义界面组件wid ...

  3. Qt第三方图形控件qwt的编译安装与使用的简单方法(Win7+Qt4.8.6+MinGW4.8.2)

    一.前言 qwt虽然强大,但是安装和编译还是有些费劲的,网上资料各种奇怪的安装方法都有,但经过博主多方尝试,终于还是发现,根据qwt官方安装文档安装才是最简单省力的.步骤很简单,下面分别介绍. 二.下 ...

  4. 【QT 基础教程 四】QT中的控件与事件

    概要:这期主要讲解Qt中的控件和事件的概念.然后,我还会简单介绍一些常见的控件以及事件. Qt控件是什么? Qt 控件又称组件或者部件,指用户看到的所有可视化界面以及界面中的各个元素.比如按钮.文本框 ...

  5. Qt 设计师-Qt Designer基础控件介绍

    Layouts: Vertical Layout:垂直布局 Horizontal Layout:水平布局 Gird Layout:栅格布局 FormLayout:表单布局 关于布局有很多博客写的很好就 ...

  6. wpf控件设计时支持(2)

    原文:wpf控件设计时支持(2) 这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法 集合项属性设计时支持 1.为集合属性设计器识别具体项类型 wpf设计器允许定义集合项的类型,如 ...

  7. QT中树控件QTreeView开发实例

    转自:http://mobile.51cto.com/symbian-268700.htm 本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代 ...

  8. wpf控件设计时支持(1)

    wpf控件设计时支持(1) 原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开 ...

  9. QT旋转按钮控件的实现

    目录 一.实现需求:鼠标hover时旋转 二.实现方式:计时器做动画 三.代码实现 QT旋转按钮控件的实现 一.实现需求:鼠标hover时旋转 需求是:实现类似于WINDOWS下,某些软件窗口关闭按钮 ...

  10. CGContextRef绘图-iOS球形波浪加载进度控件-HcdProcessView详解

    简书也有发布:http://www.jianshu.com/p/20d7... <iOS球形波浪加载进度控件-HcdProcessView>这篇文章已经展示了我在项目中编写的一个球形进度加 ...

最新文章

  1. 监管AI?吴恩达跟马斯克想到一块去了
  2. Oracle将关闭Java.net和Kenai.com社区
  3. 如何在两个jsp页面之间传值,在另外一个页面用EL表达式获取值
  4. 【Linux】free命令查询服务器内存信息
  5. Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
  6. 动态展开所有_动态演示立方体的展开,并且显示11种展开图——GeoGebra制作教程...
  7. matlab矩阵方程奇异,matlab求解非线性方程组 牛顿迭代发 奇异矩阵
  8. enctype=multipart/form-data 文件上传
  9. idea导入java文件_怎么在idea中导入Java文件并运行文件
  10. 复盘图像双线性插值推导细节
  11. ECMAscript6 初涉摘抄笔记
  12. 学英语《每日一歌》之brave
  13. 虚拟机中Deepin v20 配置共享文件夹及修改Linux系统环境PATH
  14. 使用Python将微信和支付宝账单导入随手记
  15. 用python编程解一元二次方程
  16. P14 Optimistic Concurrency Control 课程观看笔记
  17. key_t键和ftok函数
  18. staruml 免费版
  19. 【java毕业设计】基于javaEE+SSH+SqlServer的企业车辆管理系统设计与实现(毕业论文+程序源码)——车辆管理系统
  20. 伦敦同业拆借利率(LIBOR)

热门文章

  1. 老男孩教育python全栈第九期视频
  2. matlab图上面加箭头,利用matlab如何在图形中绘制箭头
  3. maven的资源过滤filters
  4. 借了你的爱,用我一辈子来还
  5. linux c 拒绝服务攻击,低速率拒绝服务攻击原理
  6. 流量之战:阿里150亿入股分众,到底为哪般?
  7. 删除xx天之前的文件夹python
  8. [渝粤教育] 西南科技大学 公共人力资源管理 在线考试复习资料
  9. OpenStack虚拟机冷迁移与热迁移
  10. linux 利用缓存文件.swp恢复源文件