Qt :圆圈加载进度条(转圈圈)

两种样式

圆形
在这里插入图片描述
环形
在这里插入图片描述

源码

头文件
这里没有使用任何ui文件

继承QDialog,设置标题栏隐藏,并设置为模态(阻塞父窗口):目的是为了让用户不能进行任何操作

#pragma once
#include <QDialog>
class JcProcessBar :
	public QDialog
{
    
    
	Q_OBJECT
public:
	JcProcessBar(QWidget* pParent = nullptr);
	~JcProcessBar();
	void paintEvent(QPaintEvent *event);
private slots:
	void  updaterRotation();
private:
	double rotation = 0.0;
	QTimer *timer = nullptr;
};

cpp

#include "stdafx.h"
#include "JcProcessBar.h"
#include<QPainter>
#include<QTimer>
#include <QDebug>
JcProcessBar::JcProcessBar(QWidget* pParent  ): QDialog(pParent)
{
    
    
	this->resize(100, 100);
	timer = new QTimer();
	connect(timer, &QTimer::timeout, this, &JcProcessBar::updaterRotation);// 定时旋转坐标系
	timer->start(10); 
	this->setModal(true);//设置为模态,该窗口不关闭,父窗口不能操作
	//隐藏标题栏
	//this->setWindowFlags(Qt::FramelessWindowHint);
	this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
	//背景透明
	setAttribute(Qt::WA_TranslucentBackground, true);
}


JcProcessBar::~JcProcessBar()
{
    
    
	if (timer)
	{
    
    
		delete timer;
		timer = nullptr;
	}
}
void  JcProcessBar::updaterRotation()
{
    
    
	rotation++;
	if (rotation == 360)
	{
    
    
		rotation = 0;
	}
	update();
}
void JcProcessBar::paintEvent(QPaintEvent *event)
{
    
    //根据QPaintPath画出渐变色的圆弧
	int width = this->width();
	int height = this->height();
	int side = qMin(width, height);

	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
	painter.translate(width / 2, height / 2);
	painter.scale(side / 200.0, side / 200.0);

	QConicalGradient gra(QPoint(0, 0), 0);
	gra.setColorAt(0, QColor("#3BB6FE"));
	gra.setColorAt(1, QColor("#FFFFFF"));
	QBrush brush(gra);

	int radis = 40;
	int sider = 10;
	QRect rect(-radis, -radis, radis * 2, radis * 2);
	QPainterPath path;
	path.arcTo(rect, 0, 270);
 
	QPainterPath subPath;
	subPath.addEllipse(rect.adjusted(sider, sider, -sider, -sider));
	//这行注释掉就是圆形,加上去就是环形
	//path = path - subPath;
	painter.setBrush(brush);
	painter.setPen(Qt::NoPen);
	painter.rotate(rotation);
	painter.drawPath(path);
}

 

这里使用QPainterPath 绘图
首先绘制 270°的圆使用

	QRect rect(-radis, -radis, radis * 2, radis * 2);
	QPainterPath path;
	path.arcTo(rect, 0, 270);

也就是第一张图

如果要绘制圆环,就再定义一个 QPainterPath

	QPainterPath subPath;
	subPath.addEllipse(rect.adjusted(sider, sider, -sider, -sider));

相减得到圆环

path = path - subPath;

猜你喜欢

转载自blog.csdn.net/fuyouzhiyi/article/details/127263246