#pragma once
#include <QWidget>
#include <QTimer>
class RzhWaitingLoadWidget : public QWidget
{
Q_OBJECT
public:
RzhWaitingLoadWidget(QWidget *parent = Q_NULLPTR);
~RzhWaitingLoadWidget();
enum PaintType {
Circle = 0,
Rectangle
};
//设置渐变颜色;
void SetColor(const QColor& startColor, const QColor& endColor);
//设置提示字符串;
void SetWarningString(const QString& string);
protected:
void OnUpdateTimerTimeout();
virtual void paintEvent(QPaintEvent *event);
void GetLinearColor(QColor startCol, QColor endCol, QVector<QColor>& colors, int count);
void closeEvent(QCloseEvent *event);
void hideEvent(QHideEvent *event);
void showEvent(QShowEvent* event);
private:
QTimer* m_updateTimer;
QVector<QColor> m_linearColor;
int m_curIndex;//0-11
QColor m_startColor;
QColor m_endColor;
PaintType m_type = Rectangle;
QString m_waringString;
};
#include "RzhWaitingLoadWidget.h"
#include <QPainter>
#include <QDebug>
#define PerAngle 360/12
RzhWaitingLoadWidget::RzhWaitingLoadWidget(QWidget *parent)
: QWidget(parent)
{
setFixedSize(200, 100);
//setWindowFlags(Qt::FramelessWindowHint);
m_updateTimer = new QTimer(this);
connect(m_updateTimer, &QTimer::timeout, this, &RzhWaitingLoadWidget::OnUpdateTimerTimeout);
m_curIndex = 0;
m_startColor = QColor(187, 255, 255);
m_endColor = QColor(46 ,139 ,87);
GetLinearColor(m_startColor, m_endColor, m_linearColor, 12);
//setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
//this->setWindowModality(Qt::WindowModal);
//setWindowModality(Qt::ApplicationModal);
m_waringString = tr("Loading");
}
RzhWaitingLoadWidget::~RzhWaitingLoadWidget()
{
}
void RzhWaitingLoadWidget::GetLinearColor(QColor startCol, QColor endCol, QVector<QColor>& colors, int count)
{
colors.clear();
int l_r, l_g, l_b;
int l_dr = endCol.red() - startCol.red();
int l_dg = endCol.green() - startCol.green();
int l_db = endCol.blue() - startCol.blue();
for (int i = 0; i < count; i++)
{
l_r = startCol.red() + l_dr * i / count;
l_g = startCol.green() + l_dg * i / count;
l_b = startCol.blue() + l_db * i / count;
QColor l_newCol(l_r, l_g, l_b, 255);
colors.append(l_newCol);
}
}
void RzhWaitingLoadWidget::closeEvent(QCloseEvent *event)
{
m_updateTimer->stop();
}
void RzhWaitingLoadWidget::hideEvent(QHideEvent *event)
{
m_updateTimer->stop();
}
void RzhWaitingLoadWidget::showEvent(QShowEvent* event)
{
if (m_updateTimer->isActive() == false)
{
m_updateTimer->start(100);
}
}
void RzhWaitingLoadWidget::paintEvent(QPaintEvent *event)
{
int l_width = width();
int l_height = height();
int l_angle = m_curIndex * PerAngle;
QPainter l_painter(this);
l_painter.setRenderHint(QPainter::Antialiasing, true);
l_painter.save();
l_painter.translate(QPoint(l_width / 2, 40));
l_painter.rotate(l_angle);
double l_smallCircleRadius = 1;
for (int i = 0; i < 12; ++i)
{
l_painter.setBrush(QBrush(m_linearColor[i]));
l_painter.setPen(Qt::NoPen);
if (m_type == Circle)
{
int l_circleRadius = 30;
l_painter.drawEllipse(QPointF(0, -l_circleRadius), l_smallCircleRadius, l_smallCircleRadius);
l_smallCircleRadius += 0.5;
}
else
{
int l_rectangleRadius = 15;
int l_rectHeight = 15;
int l_rectWidth = 4;
l_painter.drawRect(QRect(-l_rectWidth/2, -l_rectangleRadius - l_rectHeight, l_rectWidth, l_rectHeight));
}
l_painter.rotate(PerAngle);
}
l_painter.restore();
QRect l_rect = this->rect();
l_rect.setHeight(l_rect.height() - 3);
l_painter.drawText(l_rect, Qt::AlignBottom | Qt::AlignHCenter, m_waringString);
}
void RzhWaitingLoadWidget::SetColor(const QColor& startColor, const QColor& endColor)
{
m_startColor = startColor;
m_endColor = endColor;
}
void RzhWaitingLoadWidget::SetWarningString(const QString& string)
{
m_waringString = string;
}
void RzhWaitingLoadWidget::OnUpdateTimerTimeout()
{
m_curIndex++;
if (m_curIndex > 11)
{
m_curIndex = 0;
}
update();
}