Qt 简约美观的加载动画 第九季

这次和大家分享6个非常清爽的加载动画.
😊 效果如下 😊
在这里插入图片描述
一共三个文件 , 可以直接编译运行的呢

//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QGridLayout>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.setWindowTitle("加载动画 第9季");QGridLayout * mainLayout = new QGridLayout;auto* anim1 = new ThreeRevolvingBalls;mainLayout->addWidget(anim1,0,0);auto* anim2 = new InfinityLoop;mainLayout->addWidget(anim2,0,1);auto* anim3 = new Fingerprint;mainLayout->addWidget(anim3,0,2);auto* anim4 = new Solitary9Swords;mainLayout->addWidget(anim4,1,0);auto* anim5 = new LithiumWave;mainLayout->addWidget(anim5,1,1);auto* anim6 = new DotInCircle;mainLayout->addWidget(anim6,1,2);w.setLayout(mainLayout);w.show();anim1->start();anim2->start();anim3->start();anim4->start();anim5->start();anim6->start();return a.exec();
}
//LoadingAnimWidget.h
#ifndef LOADINGANIMWIDGET_H
#define LOADINGANIMWIDGET_H
#include <QPropertyAnimation>
#include <QWidget>
class LoadingAnimBase:public QWidget
{Q_OBJECTQ_PROPERTY(qreal angle READ angle WRITE setAngle)
public:LoadingAnimBase(QWidget* parent=nullptr);virtual ~LoadingAnimBase();qreal angle()const;void setAngle(qreal an);
public slots:virtual void exec();virtual void start();virtual void stop();
protected:QPropertyAnimation mAnim;qreal mAngle;
};
class ThreeRevolvingBalls:public LoadingAnimBase{
public:ThreeRevolvingBalls(QWidget* parent = nullptr);//三个绕着中心店旋转和缩放的球
protected:void paintEvent(QPaintEvent*);
};class InfinityLoop:public LoadingAnimBase{//一个无穷大标志的双环,上面有一个行星在无尽地绕行
public:InfinityLoop(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
class Fingerprint:public LoadingAnimBase{//一个多层的转动的圆环,像变幻的指纹
public:Fingerprint(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
class Solitary9Swords:public LoadingAnimBase{//六根竖线旋转,中间变幻出18根竖线,有点像独孤九剑在空中的残影
public:Solitary9Swords(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
class LithiumWave:public LoadingAnimBase{//中间是相连的三个小球,它们的转动引起周围波浪发散出去,类似锂离子的三个质子振动
public:LithiumWave(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
class DotInCircle:public LoadingAnimBase{//一个圆圈内部有一个小球绕着内侧轨道转动,模仿的小米手机浏览器的加载动画
public:DotInCircle(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};#endif
//LoadingAnimWidget.cpp
#include "LoadingAnimWidget.h"
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QtMath>
#include <QRandomGenerator>
LoadingAnimBase::LoadingAnimBase(QWidget* parent):QWidget(parent){mAnim.setPropertyName("angle");mAnim.setTargetObject(this);mAnim.setDuration(2000);mAnim.setLoopCount(-1);//run forevermAnim.setEasingCurve(QEasingCurve::Linear);setFixedSize(200,200);mAngle = 0;
}
LoadingAnimBase::~LoadingAnimBase(){}
void LoadingAnimBase::exec(){if(mAnim.state() == QAbstractAnimation::Stopped){start();}else{stop();}
}
void LoadingAnimBase::start(){mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}
void LoadingAnimBase::stop(){mAnim.stop();
}
qreal LoadingAnimBase::angle()const{ return mAngle;}
void LoadingAnimBase::setAngle(qreal an){mAngle = an;update();
}
ThreeRevolvingBalls::ThreeRevolvingBalls(QWidget* parent ):LoadingAnimBase(parent){}
void ThreeRevolvingBalls::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);const qreal x = width();const qreal y = height();painter.setPen(Qt::NoPen);static const QColor colorList[3] = {"cadetblue" , "coral" , "hotpink"};painter.translate(x/2,y/2);painter.rotate(mAngle);for(int i = 0;i < 3;++i){painter.setBrush(QBrush(colorList[i]));const auto r = (0.1+0.03*qSin(M_PI/60*mAngle))*y;painter.drawEllipse(QPointF(0,-y/6),r,r);painter.rotate(120);}
}
InfinityLoop::InfinityLoop(QWidget* parent):LoadingAnimBase (parent){}
void InfinityLoop::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);const qreal x = width();const qreal y = height();const qreal r = 0.45*x / (1+qSqrt(2));static const qreal _sqrt2 = 0.70711;// 1/根号2painter.setBrush(Qt::NoBrush);painter.translate(x/2,y/2);QColor railColor("lightgray");railColor.setAlphaF(0.5);QPen pen(railColor);pen.setWidth(6);painter.setPen(pen);//先画一个淡色的轨道QPainterPath pp;pp.moveTo(0,0);pp.lineTo(_sqrt2*r,-_sqrt2*r);pp.arcTo(QRectF(0.45*x-2*r,-r,2*r,2*r),135,-270);pp.lineTo(-_sqrt2*r,-_sqrt2*r);pp.arcTo(QRectF(-0.45*x,-r,2*r,2*r),45,270);pp.lineTo(0,0);painter.drawPath(pp);//画一个小火车pen.setColor("darkgray");painter.setPen(pen);static const int totPercent = 30;const int rotateAngle = 270;if(mAngle < rotateAngle){for(int i = 0;i < totPercent;++i){qreal percent = mAngle / rotateAngle - 0.01*i;int tmp = percent*100;percent = tmp/100.0;//精度不要太高,否则起点会有抖动if(percent < 0 ) break;painter.drawEllipse( pp.pointAtPercent(percent) , 2,2);}}else{int left = (360-mAngle)/(360-rotateAngle) * totPercent;for(int i = 0;i < left;++i){painter.drawEllipse(pp.pointAtPercent(1 - 0.01*i),2,2);}}
}
Fingerprint::Fingerprint(QWidget* parent):LoadingAnimBase (parent){mAnim.setDuration(8000);
}
void Fingerprint::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setBrush(Qt::NoBrush);QPen pen("darkseagreen");pen.setWidth(2);pen.setCapStyle(Qt::RoundCap);painter.setPen(pen);const qreal x = width();const qreal y = height();painter.translate(x/2,y/2);static const int loopNum = 12;//12层指纹static const int gap = 6;//指纹的间距static QList<qreal> spanList;if(spanList.size() <= 0){for(int i = 0;i < 361;++i)spanList.push_back(120+60*qSin(M_PI*2/360*i));}for(int i = 0;i < loopNum;++i){const int r = gap*(i+1);const qreal start = mAngle*(i+1);//越往外,速度越快const int idx = mAngle;painter.drawArc(QRectF(-r,-r,r*2,r*2),start*16,16*spanList[idx]);}
}
Solitary9Swords::Solitary9Swords(QWidget* parent):LoadingAnimBase(parent){mAnim.setDuration(4000);
}void Solitary9Swords::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);const qreal x = width();const qreal y = height();painter.translate(x/2,y/2);painter.setBrush(Qt::NoBrush);static const QColor colorList[3] = {"cadetblue" , "lawngreen" , "lightblue"};QPen pen;pen.setCapStyle(Qt::RoundCap);pen.setWidthF(2);if(mAngle < 150){const qreal ratio = mAngle / 150;for(int i = 0;i < 3;++i){qreal speed = ratio;if(i == 0) speed =  qPow(ratio,0.4);//最快else if(i == 1) speed = qPow(ratio,0.6);else if(i == 2) speed = qPow(ratio,0.99);//最慢pen.setColor(colorList[i]);painter.setPen(pen);for(int a = 0;a < 6;a++){painter.rotate(60*speed);painter.drawLine(0,-0.3*y/2,0,-0.9*y/2);}painter.resetTransform();painter.translate(x/2,y/2);}}else if(mAngle < 210){pen.setColor(colorList[2]);painter.setPen(pen);for(int a = 0; a< 6;a++){painter.drawLine(0,-0.3*y/2,0,-0.9*y/2);painter.rotate(60);}}else{const qreal ratio = (mAngle - 210) / 150;pen.setColor(colorList[2]);painter.setPen(pen);painter.drawLine(0,-0.3*y/2,0,-0.9*y/2);for(int i = 0;i < 3;++i){qreal speed;if(i == 0) speed =  qPow(ratio,0.4);//最快else if(i == 1) speed = qPow(ratio,0.6);else if(i == 2) speed = qPow(ratio,0.99);//最慢pen.setColor(colorList[i]);painter.setPen(pen);for(int a = 1;a <= 5;++a){painter.rotate(60*a+ (360-a*60)*speed);painter.drawLine(0,-0.3*y/2,0,-0.9*y/2);painter.resetTransform();painter.translate(x/2,y/2);}}}
}
LithiumWave::LithiumWave(QWidget* parent):LoadingAnimBase(parent){}
void LithiumWave::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QPen pen("lightblue");pen.setWidth(2);painter.setPen(pen);painter.setBrush(QBrush("lightblue"));const qreal x = width();const qreal y = height();painter.translate(x/2,y/2);static const qreal e = 6;//等边三角形的半边长static const qreal r = 4; //质子半径qreal zoom = 0.5+ 2*qSin(M_PI / 360 * mAngle);painter.scale(zoom,zoom);painter.rotate(mAngle);//画三个质子for(int i = 0;i < 3;++i){painter.drawEllipse(QPointF(0,-sqrt(3) *2/3*e ) , r,r);painter.drawLine(0, -sqrt(3) *2/3*e,e,sqrt(3)*e/3);painter.rotate(120);}//画5层电磁波painter.resetTransform();painter.translate(x/2,y/2);painter.setBrush(Qt::NoBrush);for(int i = 0;i < 5;++i){const qreal ratio = (mAngle - i*40)/200;if(ratio < 0) break;    //最后一层都灭了,后面已经没有波了if(ratio > 1) continue;//最外层的不要画了qreal wr = x/2*(0.3 + 0.7*ratio);QColor c = pen.color();qreal opacity = qSin(M_PI*ratio);c.setAlphaF(opacity);pen.setColor(c);painter.setPen(pen);painter.drawEllipse(QPointF(0,0),wr,wr);}
}
DotInCircle::DotInCircle(QWidget* parent):LoadingAnimBase(parent){}
void DotInCircle::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setBrush(Qt::NoBrush);QPen pen("lightgray");pen.setWidth(4);painter.setPen(pen);const qreal x = width();const qreal y = height();painter.translate(x/2,y/2);painter.drawEllipse(QPointF(0,0),x/4,x/4);painter.setPen(Qt::NoPen);painter.setBrush(QBrush("darkgray"));painter.rotate(mAngle);static const qreal r = 8;painter.drawEllipse(QPointF(0,-x/4 +r*2),r,r);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268498.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【javascript】快速入门javascript

本文前言及说明 适合学过一门语言有一定基础的人看。 省略最初学习编程时的各种编程重复的基础知识。 javascript简介 编程语言&#xff08;主前端&#xff09; 用途&#xff1a;主web前后端&#xff0c;游戏&#xff0c;干别人网站 优点&#xff1a;速度快&#xff0c;浏…

用BIO实现tomcat

一、前言 本课程的难度较高&#xff0c;需要将Servlet原理和IO课程全部学完。 二、当前项目使用方式 (1).自定义servlet 自定义servlet需要实现WebServlet并且实现name和urlMapping 重启进行访问 http://localhost:8090/myServlet (2).自定义html 重启进行访问 http://loc…

【C++ 编程指南】

C 编程指南 ■ C环境安装■ C 基本语法■ 预定义宏■ # 和 ## 运算符■ C 引用■ C 命名空间■ 定义命名空间■ using 指令■ 嵌套的命名空间 ■ String类■ 类■ 类的static静态成员 ■ C 继承■ 继承类型 public、protected 或 private■ 访问控制和继承■ 多继承■ 数据抽象…

最新版阿里云Linux CentOS7 ecs-user用户安装Mysql8详细教程(超简单)

经过两天的踩坑后&#xff0c;终于成功安装&#xff0c;并找到了最快捷的安装方式。接下来就由我来给大家介绍不踩坑安装大法&#xff01; 一、下载Mysql 首先前往Mysql官网下载 MySQL官方下载地址 第一步&#xff0c;选择安装包&#xff0c;这是最关键的一步&#xff0c;选错安…

css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解

文章目录 1.相对定位 relative2.绝对定位 absolute3.固定定位4.display 转换元素5.float浮动6.float产生内容塌陷问题7.overflow CSS样式学习宝典&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 在CSS中关于定位的内容是&#xff1a;position:relative | absolute | static…

uniapp聊天记录本地存储(详细易懂)

目录 目录 1、通过websocket拿取数据 2、获取聊天数据 3、聊天信息存储 、更新 4、读取聊天记录 5、发送信息&#xff0c;信息获取 6、最终效果 1.聊天信息的存储格式 2、样式效果 写聊天项目&#xff0c;使用到了本地存储。需要把聊天信息保存在本地&#xff0c;实时获…

第105讲:Mycat垂直分表实战:从规划到解决问题的完整指南

文章目录 1.垂直分表的背景2.垂直分表案例实战2.1.垂直分表规划2.2.配置Mycat实现垂直分表2.3.重启Mycat2.4.在Mycat命令行中导入数据结构2.5.查看由Mycat分表后每个分片上存储的表2.6.Mycat垂直分表后可能遇到的问题2.7.垂直分表完成 1.垂直分表的背景 我们的商城系统数据库&…

软件测试项目实战,某购物车/测试点分析实战(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 第一步&#xff1…

winform 输出运行设备的mac地址

winform定制一个代码段 输出运行设备的mac码此方法获取的是运行设备上的物理网卡的MAC地址&#xff0c;并不包括虚拟网卡或无线网卡的MAC地址。当设备具有多个网卡时&#xff0c;它只返回第一个正常运行的网卡的MAC地址。如果未找到任何网卡&#xff0c;则返回"未找到MAC地…

贪心(基础算法)--- 区间选点

905. 区间选点 思路 &#xff08;贪心&#xff09;O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间&#xff0c;如果当前区间左端点不包含在前一个区间中&#xff0c;则选取新区间&#xff0c;所选点个数加1&#xff0c;更新当前区间右端点。如果包含&#xff0c;则跳…

雅特力AT32L021首款低功耗MCU震撼登场

雅特力于2月28日正式发布AT32L021首款入门级低功耗MCU&#xff0c;搭配不同容量Flash、SRAM&#xff0c;提供7种封装类型共21个型号选择&#xff0c;最小封装面积仅3x3mm。为降低能耗&#xff0c;延长设备运作时间&#xff0c;AT32L021系列支持多种能耗模式和休眠模式&#xff…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频&#xff0c;因此来复习巩固&#xff0c;写以…

【活动】前端世界的“祖传代码”探秘:从古老魔法到现代重构

作为一名前端工程师&#xff0c;我时常在项目中邂逅那些被岁月打磨过的“祖传代码”。它们就像古老的魔法书页&#xff0c;用HTML标签堆砌起的城堡、CSS样式表中的炼金术&#xff0c;以及JavaScript早期版本中舞动的符咒。这些代码承载着先驱们的探索精神和独特智慧&#xff0c…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

专业145+总分410+西工大西北工业大学827信号与系统考研经验电子信息与通信工程,海航,真题,大纲,参考书。

经过一年的努力&#xff0c;分数终于出来。今年专业课827信号与系统145&#xff08;很遗憾差了一点点满分&#xff0c;没有达到Jenny老师的最高要求&#xff09;&#xff0c;数一130&#xff0c;英语和政治也都比较平衡&#xff0c;总分410分&#xff0c;当然和信息通信考研Jen…

【Git】深入理解 Git 分支合并操作:git merge dev 命令详解

深入理解 Git 合并操作&#xff1a;git merge dev 命令详解 摘要&#xff1a;本文将深入探讨 Git 中的合并操作&#xff0c;以及如何使用 git merge dev 命令将dev 分支的修改合并到当前分支&#xff08;假设当前分支为main 分支&#xff09;中。通过详细的解释和示意图&#x…

linux安全--DNS欺骗,钓鱼网站搭建

目录 一&#xff0c;实验准备 首先让client能上网 1&#xff09;实现全网互通&#xff0c;实现全网互通过程请看 2&#xff09;SNAT源地址转换 3&#xff09;部署DHCP服务 4)配置DHCP服务 5&#xff09;启动服务 6&#xff09;安装DNS服务 7&#xff09;DNS配置 8)启动DNS…

HOOPS Communicator对3D大模型轻量化加载与渲染的4种解决方案

今天给大家介绍一些关于3D Web轻量化引擎HOOPS Commuicator的关键概念&#xff0c;这些概念可以帮您在HOOPS Communicator流缓存服务器之上更好地构建您自己的模型流服务器。如果您是有大型数据集&#xff0c;那么&#xff0c;使用流缓存服务器可以极大地帮助您最大限度地减少内…

Unity 预制体与变体

预制体作用&#xff1a; 更改预制体&#xff0c;则更改全部的以预制体复制出的模型。 生成预制体&#xff1a; 当你建立好了一个模型&#xff0c;从层级拖动到项目中即可生成预制体。 预制体复制模型&#xff1a; 将项目中的预制体拖动到层级中即可复制。或者选择物体复制粘贴。…

Java基础 - 6 - 面向对象(二)

Java基础 - 6 - 面向对象&#xff08;一&#xff09;-CSDN博客 二. 面向对象高级 2.1 static static叫做静态&#xff0c;可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a;类变量、实例变量&#xff08;对象…