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.mzph.cn/news/718561.shtml

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

相关文章

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobTriggerPoolHelper 初始化 (3)

文章目录 前言一、JobTriggerPoolHelper 作用&#xff1a;二、JobTriggerPoolHelper 源码介绍&#xff1a;2.1. start() 方法&#xff1a;2.2 任务触发&#xff1a;2.3 XxlJobTrigger.trigger 任务执行&#xff1a;2.4 processTrigger 任务的执行&#xff1a;2.5 runExecutor 任…

【JAVA重要知识 | 第三篇】深入理解并暴打AQS原理、ReentrantLock锁

文章目录 3.深入理解AQS、ReentrantLock3.1AQS3.1.1AQS简介3.1.2核心结构&#xff08;1&#xff09;设计模型&#xff08;2&#xff09;组成部分&#xff08;3&#xff09;State关键字 3.1.3实现的两类队列&#xff08;1&#xff09;同步队列①CLH②Node③主要行为 img条件队列…

中霖教育:注册安全工程师考是科目有哪些?

注册安全工程师的类型是职业资格证书&#xff0c;需要满足报名条件才能参加考试&#xff0c;考试通过就能发放证书。报名时间一般在八月份&#xff0c;考试时间在十月底左右。 考试科目&#xff1a; 《安全生产法律法规》 《安全生产管理》 《安全生产技术基础》 《安全生…

golang实现openssl自签名双向认证

第一步&#xff1a;生成CA、服务端、客户端证书 1. 生成CA根证书 生成CA证书私钥 openssl genrsa -out ca.key 4096创建ca.conf 文件 [ req ] default_bits 4096 distinguished_name req_distinguished_name[ req_distinguished_name ] countryName …

Node.js基础---Express路由

1. 路由的概念 1. 什么是路由 广义上来讲&#xff0c;路由就是映射关系 2. Express 中的路由 在 Express 中&#xff0c;路由指的是客户端的请求与服务器处理函数之间的映射关系 Express 中的路由分三部分&#xff1a;请求的类型、请求的URL地址&#xff0c;处理函数。如下&am…

怎么使用curl2py自动构造爬虫代码并进行网络爬虫

目录 一、了解curl2py 二、安装curl2py 三、使用curl2py生成爬虫代码 四、实际案例&#xff1a;爬取网页数据 五、总结与建议 在当今数据驱动的时代&#xff0c;网络爬虫成为了获取数据的重要工具。对于初学者来说&#xff0c;手动编写爬虫代码可能是一项挑战。幸运的是&a…

PyTorch-神经网络

神经网络&#xff0c;这也是深度学习的基石&#xff0c;所谓的深度学习&#xff0c;也可以理解为很深层的神经网络。说起这里&#xff0c;有一个小段子&#xff0c;神经网络曾经被打入了冷宫&#xff0c;因为SVM派的崛起&#xff0c;SVM不了解的同学可以去google一下&#xff0…

JavaScript 基础学习笔记(五):函数、作用域、匿名函数

目录 一、函数 1.1 声明和调用 1.2 形参和实参 1.3 返回值 二、作用域 2.1 全局作用域 2.2 局部作用域 三、匿名函数 3.1 函数表达式 3.2 立即执行函数 一、函数 理解函数的封装特性&#xff0c;掌握函数的语法规则 1.1 声明和调用 函数可以把具有相同或相似逻辑的代…

NLP_文本张量表示方法(代码示例)

目标 了解什么是文本张量表示及其作用.文本张量表示的几种方法及其实现. 1 文本张量表示 将一段文本使用张量进行表示&#xff0c;其中一般将词汇为表示成向量&#xff0c;称作词向量&#xff0c;再由各个词向量按顺序组成矩阵形成文本表示. ["人生", "该&q…

无极低码:五分钟快速上手,开启编程新时代

无极低码平台凭借其革命性的设计理念和强大的功能特性&#xff0c;正在彻底改变软件开发的传统格局。该平台专为开发者、初创企业和各类研发团队量身打造&#xff0c;旨在提供一种快速而高效的解决方案&#xff0c;以应对日益增长的业务需求和技术挑战。 1.无极低码的核心价值在…

2024《》

vue-cli到哪做了那些事 vue-cli是vue.js的脚手架&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;快速搭建Vue.js项目。 vue cli内置了webpack的一些功能&#xff0c;这些是用webpack打包时需要我们自己配置的&#xff0c;例如&#xff1a; 1.ES6代码转换成ES5代…

Linux 实现打印彩色进度条

文章目录 预备知识一、理解回车换行二、认识行缓冲1、代码一、二&#xff08;回车换行理解&#xff09;2、代码三、四&#xff08;sleep函数和ffush函数理解&#xff09; 三、简单倒计时1. 倒计时代码2、效果展示 四、进度条1、效果展示2、进度条代码makefileProcessBar.hProce…

tomcat 反向代理 自建博客 修改状态页 等

一 自建博客 随后&#xff0c;拷贝到webapps下面 并且做软连接 随后重定向 并且下载 cat >/etc/yum.repos.d/mysql.repo <<EOF [mysql57-community] nameMySQL 5.7 Community Server baseurlhttp://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/ enabled1 g…

团体程序设计天梯赛 L2-006 树的遍历

L2-006 树的遍历 分数 25 给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤30&#xff09;&#xff0c;是二叉树中结点的个数。第二行给出其后…

【Linux】Linux系统磁盘分区和挂载相关命令介绍

Linux系统磁盘分区和挂载相关命令介绍 文章目录 Linux系统磁盘分区和挂载相关命令介绍磁盘分区1、使用fdisk创建分区2、使用parted创建分区 格式化分区分区挂载自动挂载其他常见&#xff08;用&#xff09;的磁盘相关命令 在Linux系统中&#xff0c;磁盘分区和磁盘挂载是管理存…

第十四届蓝桥杯大赛B组 JAVA 蜗牛 (递归剪枝)

题目描述&#xff1a; 这天&#xff0c;一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴&#xff0c;底部纵坐标为 0&#xff0c;横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高&#xff0c;宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也…

全域电商数据集成管理与采集|API接口的采集与管理

如今&#xff0c;全渠道零售已是大势所趋。企业电商经营的一大现状就是数据分散各处&#xff0c;比如有来自电商平台私域数据、品牌一方数据、公开的第三方行业数据与电商平台C端页面数据等等。如何集成全域数据日益成为企业数字化基建的难题。 当前电商数据集成的主流方案为人…

【基于Matlab GUI的语音降噪系统设计】

客户不要了&#xff0c;挂网上吧&#xff0c;有需要自行下载~ 赚点辛苦费 ** 功能实现: ** 1、导入音频文件/录入音频&#xff0c;能实现播放功能。 2、对导入/录入的音频信号进行时域和频域分析&#xff0c;并制图。 3、可在导入/录入的音频信号上加入噪声&#xff0c;并能够播…

Apache JMeter 5.6.3 安装

源码下载 curl -O https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.3_src.zipJMeter 下载 curl -O https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zipjmeter.properties 里 设置中文 windows系统上解压&#xff0c;双击jmeter.bat 启动 执行参…

【人工智能】DeepLearning学习路线及简要说明

目录 神经网络 1.1 前馈神经网络(FNN) 结构和工作原理 训练过程 应用