目录
步骤
添加头文件
#include <QPainter>
#include <QTimer>
定义类成员数据和函数
protected:
void paintEvent(QPaintEvent *event) override;
private:
QTimer *timer;
int startAngle = 0;
配置定时器
//创建了一个新的 QTimer 对象
timer = new QTimer(this);
connect(timer, &QTimer::timeout,[=](){
//不断变化扇形的启动位置
//startAngle 变量每次增加 30 度,用于改变扇形的起始角度
startAngle += 30;
//如果 startAngle 达到或超过 360 度,则将其重置为 0 度,实现循环动画效果
if(startAngle >= 360){
startAngle = 0;
}
//调用 update() 函数,通知 Qt 需要重新绘制 Widget,因为其内容已经发生了变化
update();
});
//时间间隔为 100 毫秒
timer->setInterval(50);
//开始计时
timer->start();
重写绘图事件函数
void Widget::paintEvent(QPaintEvent *event)
{
// 创建了一个 QPainter 对象,用于在 Widget 上进行绘图。this 指针指向当前的 Widget 实例,表示绘图将在该控件上进行
QPainter painter(this);
// 设置抗锯齿渲染,可以使绘制的图形更加平滑,减少锯齿状边缘
painter.setRenderHint(QPainter::Antialiasing,true);
// 创建了一个黑色的画刷
QBrush brush(Qt::black);
// 并设置给 painter
painter.setBrush(brush);
// 然后使用 drawRect 方法绘制一个填充了黑色背景的矩形,该矩形覆盖了整个控件区域
painter.drawRect(rect());
// 将坐标系的原点移动到控件的中心,这样后续的绘图操作都将以控件中心为起点
painter.translate(rect().center());
// 最小圆的半径
int rEve = height()/2/7;
int dataTmp = rEve * 7;
// 设置画笔,绿色,像素4
QPen pen(Qt::green,4);
// 将画笔设置给对象
painter.setPen(pen);
// 不要画刷,否则只能看到最外面的圈
painter.setBrush(Qt::NoBrush);
// 依次画出7个圆形
for(int i=1; i <= 7; i++){
painter.drawEllipse(QPoint(0,0),rEve*i,rEve*i);
}
// 画出坐标轴
painter.drawLine(-rEve*7,0,rEve*7,0);
painter.drawLine(0,-rEve*7,0,rEve*7);
// 创建了一个锥形渐变对象 conGradient 渐变中心位于控件中心,起始角度由 startAngle 指定
QConicalGradient conGradient(0,0,-startAngle);
// 设置颜色
conGradient.setColorAt(0,QColor(0,255,0,200));
conGradient.setColorAt(0.1,QColor(0,255,0,100));
conGradient.setColorAt(0.2,QColor(0,255,0,0));
conGradient.setColorAt(1,QColor(0,255,0,0));
// 直接用渐变色指定画刷
painter.setBrush(conGradient);
// 去除扇形区域边框
painter.setPen(Qt::NoPen);
// 画出扇形,启动角度是startAngle,由定时器来修改
painter.drawPie(QRect(-dataTmp,-dataTmp,dataTmp*2,dataTmp*2),
-startAngle*16,70*16);
}