😊 第四季来啦 😊
效果如下:
只有三个文件,可以直接编译运行的
//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QVBoxLayout>
#include <QGridLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.setWindowTitle("加载动画 第四季");
QGridLayout * mainLayout = new QGridLayout;
auto* anim1= new JellyInBox;
mainLayout->addWidget(anim1,0,0);
auto* anim2 = new HorizontalDNA;
mainLayout->addWidget(anim2,0,1);
auto * anim3 = new LoopedRingWithText;
mainLayout->addWidget(anim3,1,0);
auto* anim4 = new Radar;
mainLayout->addWidget(anim4,1,1);
w.setLayout(mainLayout);
w.show();
anim1->start();
anim2->start();
anim3->start();
anim4->start();
return a.exec();
}
//LoadingAnimWidget.h
#ifndef LOADINGANIMWIDGET_H
#define LOADINGANIMWIDGET_H
#include <QPropertyAnimation>
#include <QWidget>
class LoadingAnimBase:public QWidget
{
Q_OBJECT
Q_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 JellyInBox:public LoadingAnimBase{
//一个会伸缩的果冻在一个小盒子里面,一开始拉伸,然后移动,然后收缩
public:
explicit JellyInBox(QWidget* parent = nullptr);
protected:
void paintEvent(QPaintEvent *event);
};
class HorizontalDNA:public LoadingAnimBase{
//两根水平方向的小球链,螺旋滚动,像DNA双分子链
public:
explicit HorizontalDNA(QWidget* parent = nullptr);
protected:
void paintEvent(QPaintEvent*);
private:
void getPosYAlphaScale(const int amplitude,const qreal & offset,qreal & y,qreal & alpha,qreal & scale);
//根据原始偏移获取当前时间点下的y轴坐标,透明度,和缩放比例
};
class LoopedRingWithText:public LoadingAnimBase{
//外面有三圈圆环转动,中间有一个高亮的灯光从左向右移动照亮字符串的一部分
public:
explicit LoopedRingWithText(QWidget* parent = nullptr);
protected:
void paintEvent(QPaintEvent*);
};
class Radar:public LoadingAnimBase{
//像一个雷达一样扫描,等待耗时操作的结束
public:
explicit Radar(QWidget* parent = nullptr);
protected:
void paintEvent(QPaintEvent*);
};
#endif // LOADINGANIMWIDGET_H
//LoadingAnimWidget.cpp
#include "LoadingAnimWidget.h"
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#