#ifndef LOADING_H
#define LOADING_H
#include <QWidget>
#include <QPainter>
#include <QTimer>
#include <QMap>
struct Location
{
public:
explicit Location(float _x,float _y){x=_x;y=_y;}
float x;
float y;
};
class Loading : public QWidget
{
Q_OBJECT
public:
explicit Loading(QWidget *parent = nullptr);
//设置圆点个数
void setDotCount(int);
//设置点颜色
void setDotColor(const QColor&);
//开始
void start();
//设置圆点最大直径
void setMaxDiameter(float);
//设置圆点最小直径
void setMinDiameter(float);
private:
//刷新计数
int _index;
//点的颜色
QColor _dotColor;
//点的个数
int _count;
//圆点最小直径
float _minDiameter;
//圆点最大直径
float _maxDiameter;
//绘制圆点
void paintDot(QPainter &);
//计数
int _i;
//时间间隔 单位:毫秒(ms)
int _interval;
//定时器
QTimer timer;
//绘制区域边长
float _squareWidth;
//圆的直径
float _centerDistance;
//直径列表
QList<float> radiiList;
//圆点坐标列表
QList<Location> locationList;
//计算
void caculate();
protected:
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
signals:
public slots:
private slots:
void refresh();
};
#endif // LOADING_H
#include "Loading.h"
#include "qmath.h"
#include <QDebug>
Loading::Loading(QWidget *parent) : QWidget(parent),_i(0),_interval(50),_index(0)
{
//设置背景透明
//this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
//this->setAttribute(Qt::WA_TranslucentBackground, true);
setDotColor(QColor(49, 177, 190));
setDotCount(20);
connect(&timer,&QTimer::timeout,this,&Loading::refresh);
setMaxDiameter(30);
setMinDiameter(5);
}
//********************************************** 设置部分 *************************************
//设置点的个数
void Loading::setDotCount(int count)
{
_count=count;
}
//设置点的颜色
void Loading::setDotColor(const QColor & color)
{
_dotColor=color;
}
//开始动画
void Loading::start()
{
timer.setInterval(_interval);
timer.start();
}
//设置最大直径
void Loading::setMaxDiameter(float max)
{
_maxDiameter=max;
}
//设置最小直径
void Loading::setMinDiameter(float min)
{
_minDiameter=min;
}
//********************************************** 绘制部分 *************************************
//刷新界面
void Loading::refresh()
{
repaint();
}
void Loading::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event)
caculate();
}
void Loading::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(_dotColor);
painter.setBrush(_dotColor);
//绘制点
paintDot(painter);
}
//计算绘制正方形区域
void Loading::caculate()
{
_squareWidth=qMin(this->width(),this->height());
float half=_squareWidth/2;
_centerDistance=half-_maxDiameter/2-1;
float gap=(_maxDiameter-_minDiameter)/(_count-1)/2;
float angleGap=(float)360/_count;
locationList.clear();
radiiList.clear();
for(int i=0;i<_count;i++)
{
radiiList<<_maxDiameter/2-i*gap;
float radian=qDegreesToRadians(-angleGap*i);
locationList.append(Location(half+_centerDistance*qCos(radian),half-_centerDistance*qSin(radian)));
}
}
//绘制圆点
void Loading::paintDot(QPainter& painter)
{
for(int i=0;i<_count;i++)
{
painter.setPen(_dotColor);
//半径
float radii=radiiList.at((_index+_count-i)%_count);
//绘制圆点
painter.drawEllipse(QPointF(locationList.at(i).x,locationList.at(i).y),radii,radii);
//绘制正方形
//painter.drawRect(locationList.at(i).x,locationList.at(i).y,radii,radii);
//绘制文字
//QFont font("Microsoft YaHei",radii*1.2,75);
//painter.setFont(font);
//painter.drawText(QPointF(locationList.at(i).x,locationList.at(i).y),u8"霞");
}
_index++;
}
Loading* loading1;
//********************** Loading *************************
loading1=new Loading(this);
loading1->start();
ui->gridLayout_2->addWidget(loading1,0,0);