两种样式
圆形
环形
源码
头文件
这里没有使用任何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;