如下:
绘制步骤:
- 先绘制底部的黑色背景
- 在绘制中间的7个圆和2条中线
- 在绘制扇形,且采用锥形渐变,颜色值带透明通道
- 绘制扇形时,需要根据给定的角度旋转QPainter
- 定时器中不停的修改这个角度,然后重绘,这个扇形就旋转起来了
.h文件
#ifndef RADAR_H
#define RADAR_H
#include <QWidget>
#include<QPainter>
#include<QTimer>
//雷达控件
class Radar : public QWidget
{
Q_OBJECT
Q_PROPERTY(int rotateAngle READ rotateAngle WRITE setRotateAngle NOTIFY rotateAngleChanged FINAL)
public:
explicit Radar(QWidget *parent = nullptr);
int rotateAngle() const;
void setRotateAngle(int newRotateAngle);
protected:
void paintEvent(QPaintEvent*) override;
private:
int mRotateAngle=0;//扇形旋转角度
QTimer* timer;
signals:
void rotateAngleChanged();
};
#endif // RADAR_H
.cpp
#include "radar.h"
Radar::Radar(QWidget *parent)
: QWidget{parent}
{
timer=new QTimer(this);
connect(timer,&QTimer::timeout,[=](){
//转到360°后归0
if(rotateAngle()==360)
{
setRotateAngle(0);
return;
}
setRotateAngle(rotateAngle()+1);
});
timer->start(10);
}
void Radar::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(this->rect().center());//画刷移到中心
//最大圆圈的半径
int r=std::min(width(),height())/2;
//1、绘制黑色背景
painter.save();
painter.setBrush(Qt::black);
painter.drawRect(QRect(QPoint(-width()/2,-height()/2),QPoint(width()/2,height()/2)));
painter.restore();
//2、绘制中间的7个圆圈和2条中线
painter.save();
painter.setPen(QPen(Qt::green,4));
for(int i=1;i<=7;++i)
{
//内部的圆的半径都是七分之几
int rCurrent=1.0*r*i/7;
painter.drawEllipse(QPoint(0,0),rCurrent,rCurrent);
}
painter.drawLine(QPoint(-r,0),QPoint(r,0));
painter.drawLine(QPoint(0,-r),QPoint(0,r));
painter.restore();
//3、绘制扫动的扇形
painter.save();
//填充采用锥形
QConicalGradient co(QPoint(0,0),0);
co.setColorAt(0,QColor(0,255,0,200));//慢慢变透明
co.setColorAt(0.1,QColor(0,255,0,100));//
co.setColorAt(0.2,QColor(0,255,0,0));//
co.setColorAt(1,QColor(0,255,0,0));//
painter.setBrush(co);
painter.setPen(Qt::NoPen);
//扇形的跨度为45°
painter.rotate(mRotateAngle);//旋转QPainter,通过改变这个旋转角度来改变扇形的位置
painter.drawPie(QRect(QPoint(-r,-r),QPoint(r,r)),0*16,45*16);
painter.restore();
}
int Radar::rotateAngle() const
{
return mRotateAngle;
}
void Radar::setRotateAngle(int newRotateAngle)
{
if (mRotateAngle == newRotateAngle)
return;
mRotateAngle = newRotateAngle;
emit rotateAngleChanged();
update();
}