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

Qt编写水波进度条控件

11
回复
18244
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2017-8-24 13:43:00 显示全部楼层 |阅读模式
本帖最后由 liudianwu 于 2017-8-25 14:44 编辑

手机app中经常能见到各种各样的水波进度条之类的效果,觉得不错,用QWidgetQPainter绘制了一个。集成到了QUC自定义控件中。原理是利用正弦曲线产生平滑曲线点集合,然后用大路径减去当前进度路径,形成水波效果。
/**
* 水波进度条控件 作者:feiyangqingyun(QQ:517216493) 2017-8-23
* 1:可设置范围值,支持负数值
* 2:可设置水波密度,密度越大浪越多
* 3:可设置水波高度,高度越大越浪
* 4:可设置边框宽度
* 5:可设置是否显示进度值
* 6:可设置进度值是否为百分比格式
* 7:可设置背景颜色、边框颜色、当前进度颜色、文字颜色
* 8:提供三种样式风格选择 方形风格 圆形风格 椭圆风格
*/


核心代码:
  1. void ProgressBarWater::drawValue(QPainter *painter)
  2. {
  3.     int height = this-> height();
  4.     int width = this->width();
  5.     int side = qMin(width, height);

  6.     //计算当前值所占百分比
  7.     double percent = 1 - (double)(value - minValue) / (maxValue - minValue);

  8.     //正弦曲线公式 y = A * sin(ωx + φ) + k

  9.     //w表示周期,可以理解为水波的密度,值越大密度越大(浪越密集 ^_^),取值 密度*M_PI/宽度
  10.     double w = waterDensity * M_PI / width;

  11.     //A表示振幅,可以理解为水波的高度,值越大高度越高(越浪 ^_^),取值高度的百分比
  12.     double A = height * waterHeight;

  13.     //k表示y轴偏移,可以理解为进度,取值高度的进度百分比
  14.     double k = height * percent;

  15.     //第一条波浪路径集合
  16.     QPainterPath waterPath1;
  17.     //第二条波浪路径集合
  18.     QPainterPath waterPath2;

  19.     //移动到左上角起始点
  20.     waterPath1.moveTo(0, height);
  21.     waterPath2.moveTo(0, height);

  22.     offset += 0.6;
  23.     if (offset > (width / 2)) {
  24.         offset = 0;
  25.     }

  26.     for(int x = 0; x <= width; x++) {
  27.         //第一条波浪Y轴
  28.         double waterY1 = (double)(A * sin(w * x + offset)) + k;

  29.         //第二条波浪Y轴
  30.         double waterY2 = (double)(A * sin(w * x + offset + (width / 2 * w))) + k;

  31.         //如果当前值为最小值则Y轴为高度
  32.         if (this->value == minValue) {
  33.             waterY1 = height;
  34.             waterY2 = height;
  35.         }

  36.         //如果当前值为最大值则Y轴为0
  37.         if (this->value == maxValue) {
  38.             waterY1 = 0;
  39.             waterY2 = 0;
  40.         }

  41.         waterPath1.lineTo(x, waterY1);
  42.         waterPath2.lineTo(x, waterY2);
  43.     }

  44.     //移动到右下角结束点,整体形成一个闭合路径
  45.     waterPath1.lineTo(width, height);
  46.     waterPath2.lineTo(width, height);

  47.     //大路径
  48.     QPainterPath bigPath;

  49.     if (percentStyle == PercentStyle_Rect) {
  50.         width = width - borderWidth * 2;
  51.         height = height - borderWidth * 2;
  52.         bigPath.addRect(borderWidth, borderWidth, width, height);
  53.     } else if (percentStyle == PercentStyle_Circle) {
  54.         side = side - borderWidth * 2;
  55.         bigPath.addEllipse((width - side) / 2, borderWidth, side, side);
  56.     } else if (percentStyle == PercentStyle_Ellipse) {
  57.         width = width - borderWidth * 2;
  58.         height = height - borderWidth * 2;
  59.         bigPath.addEllipse(borderWidth, borderWidth, width, height);
  60.     }

  61.     painter->save();

  62.     //新路径,用大路径减去波浪区域的路径,形成遮罩效果
  63.     QPainterPath path;
  64.     painter->setPen(Qt::NoPen);
  65.     QColor waterColor1 = usedColor;
  66.     waterColor1.setAlpha(100);
  67.     QColor waterColor2 = usedColor;
  68.     waterColor2.setAlpha(180);

  69.     //第一条波浪挖去后的路径
  70.     path = bigPath.intersected(waterPath1);
  71.     painter->setBrush(waterColor1);
  72.     painter->drawPath(path);

  73.     //第二条波浪挖去后的路径
  74.     path = bigPath.intersected(waterPath2);
  75.     painter->setBrush(waterColor2);
  76.     painter->drawPath(path);

  77.     painter->restore();
  78. }
复制代码


本帖子中包含更多资源

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

x
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2017-8-24 22:01:40 显示全部楼层
厉害了,值得学习,复制代码去试试看
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2017-9-16 11:51:08 显示全部楼层
能把这个源码共享一份给我嘛,谢谢? 452125243@qq.com
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2018-1-2 17:31:40 显示全部楼层
不错,学习学习波浪的绘制。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2018-4-18 09:02:25 显示全部楼层
支持一下!好东西~~~~~~~~
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2018-5-11 12:53:41 显示全部楼层
6666666666666666666666666666666
回复 支持 反对

使用道具 举报

尚未签到

2018-5-14 21:45:53 显示全部楼层

能把这个源码共享一份给我嘛,谢谢? 1458694459@qq.com
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2018-7-24 10:59:54 显示全部楼层
能把这个源码共享一份给我嘛,谢谢? 27595746@qq.com
回复 支持 反对

使用道具 举报

累计签到:82 天
连续签到:1 天
2018-7-24 15:40:14 显示全部楼层
学习了,谢谢楼主!~~~~~~~~~
回复 支持 反对

使用道具 举报

尚未签到

2018-7-28 11:35:12 显示全部楼层
大神,能把源码发我一份吗 541717868@qq.com
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2018-8-23 14:35:37 显示全部楼层
hutucai15 发表于 2018-7-24 10:59
能把这个源码共享一份给我嘛,谢谢?

拿到源码了吗 能不能分享一下
回复 支持 反对

使用道具 举报

尚未签到

2018-11-27 10:02:54 显示全部楼层
大神,正在学习这个波浪控件,能发一份源码学习下吗,谢谢!2262183909@qq.com
回复 支持 反对

使用道具 举报

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

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