效果图
- 逆时针旋转
  
- 顺时针旋转
  
功能
- 基于QWidget开发, 开箱即用。没有额外附加,直接拉入加入工程代码即可实现效果
支持设置加载进度条颜色,对应调用函数:
	/// 
	/// @brief:	设置换装等待的颜色
	/// @param:	color 颜色字符串, 比如"#FF00FF33"
	/// @return:	void 
	///				
	void setFillColor(const QString& color);
支持设置中间显示文字、文字颜色、文字大小, 对应调用函数
	/// 
	/// @brief:	设置文字
	/// @param:	str 
	/// @return:	void 
	///				
	void setCenterText(const QString& str);
	/// 
	/// @brief:	设置文字颜色 
	/// @param:	color 
	/// @return:	void 
	///				
	void setCenterTextColor(const QString& color);
	/// 
	/// @brief:	设置中间文字的大小
	/// @param:	size 
	/// @return:	void 
	///				
	void setCenterTextPointSize(int size);
	/// 
	/// @brief:	设置中间字体加粗 
	/// @param:	isBold 
	/// @return:	void 
	///				
	void setCenterTextBold(bool isBold);
设置旋转方向, 对应函数
	/// 
	/// @brief:	设置旋转方向, true-顺时针, false-逆时针 
	/// @param:	clockWise 
	/// @return:	void 
	///				
	void setRotation(bool clockW
全部代码
#pragma once
#include <QWidget>
/// 
/// 环状等待控件。
/// 
class CircleWaitingWidget : public QWidget
{
	Q_OBJECT
public:
	explicit CircleWaitingWidget(QWidget* parent = nullptr);
	virtual ~CircleWaitingWidget();
	/// 
	/// @brief:	设置换装等待的颜色
	/// @param:	color 颜色字符串, 比如"#FF00FF33"
	/// @return:	void 
	///				
	void setFillColor(const QString& color);
	/// 
	/// @brief:	设置文字
	/// @param:	str 
	/// @return:	void 
	///				
	void setCenterText(const QString& str);
	/// 
	/// @brief:	设置文字颜色 
	/// @param:	color 
	/// @return:	void 
	///				
	void setCenterTextColor(const QString& color);
	/// 
	/// @brief:	设置中间文字的大小
	/// @param:	size 
	/// @return:	void 
	///				
	void setCenterTextPointSize(int size);
	/// 
	/// @brief:	设置中间字体加粗 
	/// @param:	isBold 
	/// @return:	void 
	///				
	void setCenterTextBold(bool isBold);
	/// 
	/// @brief:	设置旋转方向, true-顺时针, false-逆时针 
	/// @param:	clockWise 
	/// @return:	void 
	///				
	void setRotation(bool clockWise);
protected:
	void paintEvent(QPaintEvent*) override;
private:
	struct CircleWidgetImp;
	CircleWidgetImp* m_imp{ nullptr };
};
#include "CircleWaitingWidget.h"
#include <QPainter>
#include <QTimer>
#include <QConicalGradient>
#include "qmath.h"
struct CircleWaitingWidget::CircleWidgetImp
{
	int m_angle{ 0 };
	//int m_span{ 120 };
	QTimer* m_timer{ nullptr };
	/// 环状颜色
	QString m_color{ "#22EE22" };
	/// 文字
	QString		m_centerText{"ABCD"};
	/// 文字颜色
	QString		m_centerTextColor{"#222222"};
	/// 文字大小
	int			m_centerTextPointSize{ 20 };
	/// 字体加粗
	bool		m_centerTextBold{ false };
	/// 旋转方向, true-顺时针,false-逆时针
	bool		m_rotationIsClockWise{ true };
};
CircleWaitingWidget::CircleWaitingWidget(QWidget* parent /* = nullptr */) : QWidget(parent)
{
	m_imp = new(std::nothrow) CircleWidgetImp;
	m_imp->m_timer = new QTimer(this);
	connect(m_imp->m_timer, &QTimer::timeout, [this]()
		{
			if (true == m_imp->m_rotationIsClockWise)
			{
				m_imp->m_angle = (m_imp->m_angle + 2) % 360;
			}
			else
			{
				m_imp->m_angle = (m_imp->m_angle - 2) % 360;
			}
		
			update();
		});
	m_imp->m_timer->start(25);
}
CircleWaitingWidget::~CircleWaitingWidget()
{
	m_imp->m_timer->stop();
    delete m_imp->m_timer;
	delete m_imp;
}
/// 
/// @brief:	设置换装等待的颜色 
/// @param:	color 
/// @return:	void 
///				
void CircleWaitingWidget::setFillColor(const QString& color)
{
	m_imp->m_color = color;
	update();
}
/// 
/// @brief:	setCenterText 
/// @param:	str 
/// @return:	void 
///				
void CircleWaitingWidget::setCenterText(const QString& str)
{
	m_imp->m_centerText = str;
	update();
}
/// 
/// @brief:	setCenterTextColor 
/// @param:	color 
/// @return:	void 
///				
void CircleWaitingWidget::setCenterTextColor(const QString& color)
{
	m_imp->m_centerTextColor = color;
	update();
}
/// 
/// @brief:	setCenterTextPointSize 
/// @param:	size 
/// @return:	void 
///				
void CircleWaitingWidget::setCenterTextPointSize(int size)
{
	m_imp->m_centerTextPointSize = size;
	update();
}
/// 
/// @brief:	设置中间字体加粗 
/// @param:	isBold 
/// @return:	void 
///				
void CircleWaitingWidget::setCenterTextBold(bool isBold)
{
	m_imp->m_centerTextBold = isBold;
	update();
}
/// 
/// @brief:	setRotation 
/// @param:	clockWise 
/// @return:	void 
///				
void CircleWaitingWidget::setRotation(bool clockWise)
{
	m_imp->m_rotationIsClockWise = clockWise;
	update();
}
/// 
/// @brief:	paintEvent 
/// @param:	* 
/// @return:	void 
///				
void CircleWaitingWidget::paintEvent(QPaintEvent* event)
{
	Q_UNUSED(event);
	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing);
	const int side = qMin(width(), height());
	painter.translate(width() / 2, height() / 2);
	painter.scale(side / 200.0, side / 200.0);
	QConicalGradient gradient(0, 0, -m_imp->m_angle);
	/// 如果是逆时针
	if (false == m_imp->m_rotationIsClockWise)
	{
		gradient.setColorAt(0.0, QColor(m_imp->m_color));
		gradient.setColorAt(1.0, QColor("#FFFFFF"));
	}
	/// 顺时针
	else
	{
		gradient.setColorAt(1.0, QColor(m_imp->m_color));
		gradient.setColorAt(0.0, QColor("#FFFFFF"));
	}
	QPen pen{};
	pen.setWidth(20);
	pen.setCapStyle(Qt::RoundCap);
	pen.setBrush(gradient);
	painter.setPen(pen);
	int startAngle = 0 * 16;
	int spanAngle = 360 * 16;
	painter.drawArc(-90, -90, 180, 180, startAngle, spanAngle);
	/// 绘制文字
	if (false == m_imp->m_centerText.isEmpty())
	{
		painter.setBrush(Qt::NoBrush);
		QFont tmpFont = painter.font();
		tmpFont.setPointSize(m_imp->m_centerTextPointSize);
		tmpFont.setBold(m_imp->m_centerTextBold);
		painter.setFont(tmpFont);
		painter.setPen(QColor(m_imp->m_centerTextColor));
		painter.drawText(-90, -90, 180, 180, Qt::AlignCenter, m_imp->m_centerText);
	}
}