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.pswp.cn/news/718561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718561.shtml
英文地址,請注明出處:http://en.pswp.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) 結構和工作原理 訓練過程 應用