雷达控件

如下:

绘制步骤:

  1. 先绘制底部的黑色背景
  2. 在绘制中间的7个圆和2条中线
  3. 在绘制扇形,且采用锥形渐变,颜色值带透明通道
  4. 绘制扇形时,需要根据给定的角度旋转QPainter
  5. 定时器中不停的修改这个角度,然后重绘,这个扇形就旋转起来了

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值