Qt等待对话框加载

 

 

 

 

 

#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();
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值