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,一经查实,立即删除!

相关文章

【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 …

怎么使用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…

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…

第十四届蓝桥杯大赛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 启动 执行参…

架构设计方法(4A架构)-应用架构

1、应用架构&#xff08;AA&#xff09;&#xff1a;业务价值与产品之间的桥梁&#xff0c;是企业架构的一个子集 2、应用架构包含“应用系统模块、应用服务、应用系统集成”3个关键要素 3、收集AS-IS应用架构&#xff0c;描绘现状&#xff0c;并识别改进机会点 4、描述对新系统…

uniapp 安卓YYEVAPlayer MP4礼物播放器原生插件

插件介绍 安卓YYEVAPlayer MP4礼物播放器原生插件&#xff0c;是一个轻量的动画渲染库&#xff0c;使用Native Opengles 渲染视频&#xff0c;为你提供高性能、低开销的动画体验 对比传统的序列帧的动画播放方式&#xff0c;具有更高的压缩率&#xff0c;硬解码效率更高的优点…

【NR 定位】3GPP NR Positioning 5G定位标准解读(四)

目录 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的网络接口 6.1.1 通用LCS控制平面架构 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 终端协议 6.2.1 LTE定位协议&#xff08;LPP&#x…

TikTok企业认证教程:提升账号可信度的必备步骤

TikTok企业认证是TikTok平台用来验证账号真实性和权威性的方式。通过企业认证之后&#xff0c;企业能在TikTok上获得官方标识&#xff0c;可以增强品牌的专业形象&#xff0c;也有利于提升用户对企业内容的信任度。而且通过TikTok企业认证还可以解锁高级功能&#xff0c;如数据…

贪心(基础算法)--- 牛马耍杂技

耍杂技的牛 农民约翰的N头奶牛&#xff08;编号为1…N&#xff09;计划逃跑并加入马戏团&#xff0c;为此它们决定练习表演杂技。 奶牛们不是非常有创意&#xff0c;只提出了一个杂技表演&#xff1a; 叠罗汉&#xff0c;表演时&#xff0c;奶牛们站在彼此的身上&#xff0c…

【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱

1 基本定义 T1小波滤波算法是一种基于小波变换的信号去噪算法。它可以有效地去除信号中的噪声&#xff0c;并保留信号的主要特征。该算法的主要思想是将信号分解为多个不同尺度的小波系数&#xff0c;然后通过对小波系数进行阈值处理来去除噪声。 具体来说&#xff0c;T1小波滤…

服务器数据恢复-服务器RAID5上层XFS文件系统分区数据恢复案例

服务器数据恢复环境&#xff1a; MD1200磁盘柜中的磁盘通过RAID卡创建了一组RAID5阵列&#xff0c;分配了一个LUN。在Linux操作系统层面对该LUN进行了分区&#xff0c;划分sdc1和sdc2两个分区&#xff0c;通过LVM扩容的方式将sdc1分区加入到了root_lv中&#xff1b;sdc2分区格式…