使用QT绘制雷达扫描效果

话不多说直接上代码,代码规范性可能差了点,但是效果得以实现,在这里记录一下。
源码工程在这里下载地址
scan.h的代码如下

#ifndef SCAN_H
#define SCAN_H

#include <QWidget>
#include <QPainter>
#include <QTime>
#include <QTimer>
#include <QDebug>
#include <QPoint>
#include <QtMath>

namespace Ui {
class Scan;
}
class Scan : public QWidget
{
    Q_OBJECT
public:
    explicit Scan(QWidget *parent = nullptr);
    ~Scan();
public slots:
   void timerTimeOut();
protected:
   void paintEvent(QPaintEvent *event) override;
private slots:
   void on_pushButton_clicked();
private:
    Ui::Scan *ui;
};
#endif // SCAN_H

scan.cpp的代码如下

#include "scan.h"
#include "ui_scan.h"
QTimer *timer = new QTimer();
int m_angle=0;
int alpha=0;
double cir_size=5;
Scan::Scan(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Scan)
{
    ui->setupUi(this);
    setPalette(Qt::black); setAutoFillBackground(true);//强制设置背景颜色为黑色
    connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeOut()));//用槽函数控制雷达扫描效果。
    timer->start(10);


}

Scan::~Scan()
{
    delete ui;
}

void Scan::timerTimeOut()
{
    timer->start(10);
    if(m_angle<-360){
        m_angle=0;
    }//实现无缝连接,且保证m_angle的值不会溢出
    if(alpha>=255){
        alpha = 0;
    }
    if(cir_size>10){
        cir_size=5;
    }
    update();
}
void Scan::paintEvent(QPaintEvent *event)//此函数自动执行,实现扫描动画效果
{
    Q_UNUSED(event);
    QPainter painter(this);
    QPen pen;
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QPen(qRgba(128, 255, 0,250)));

    //网格改成坐标系
    int x=280;//原本为240,右移40,下移60
    int y=300;
    /** 直径按照480处理 每隔40px画一个圆 绘制雷达图**/
    QPoint center(x,y);
    painter.drawEllipse(center,240,240);
    painter.drawEllipse(center,240-48,240-48);
    painter.drawEllipse(center,240-96,240-96);
    painter.drawEllipse(center,240-144,240-144);
    painter.drawEllipse(center,240-192,240-192);
    /** 画外圈刻度值,将坐标系移动到圆心 **/
    painter.translate(x,y);
    painter.setPen(QPen(qRgba(255, 255, 0,250)));
    painter.setFont(QFont("Calibri",10));
    for(int i=1;i<=360;i++){
           painter.rotate(1);
           painter.drawLine(0,-240,0,-235);
    }
    for(int i=1;i<=72;i++){
        painter.rotate(5);
        painter.drawLine(0,-240,0,-232);
    }
    for(int i=1;i<=36;i++){
        painter.setRenderHint(QPainter::Antialiasing);
        painter.rotate(10);
        painter.drawLine(0,-240,0,-228);
    }
    for(int i=1;i<=4;i++){
        painter.rotate(90);
        painter.drawLine(0,-240,0,-168);
    }
    painter.translate(-x,-y);//恢复坐标系
   /** 绘制扫描效果 **/
    QConicalGradient gradient(x, y, m_angle + 360);
    gradient.setColorAt(0.1, QColor(128, 255, 0, 150));
    gradient.setColorAt(0.7, QColor(0, 255, 0, 0));//尾部
    painter.setBrush(gradient);
    painter.setPen(QPen(Qt::NoPen));//去掉外框线
    if (width() > height()){
        painter.drawPie(40, 60, 480, 480, m_angle * 16, 360 * 16);
    }
    else{ painter.drawPie(40, 60, 480, 480, m_angle * 16, 360 * 16);}
    
    m_angle -= 1;//每次旋转1度
    alpha +=2;
    cir_size+=0.01;

    //模拟画出可疑点
    painter.setBrush(QBrush(QColor(50, 255, 200,alpha)));
    painter.drawEllipse(0,0,15,15);
    painter.drawEllipse(60+120,60+161,cir_size,cir_size);
    painter.drawEllipse(60+240,60+161,cir_size,cir_size);
    painter.drawEllipse(60+300,60+300,cir_size,cir_size);
    painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+50)%255)));
    painter.drawEllipse(60+160,60+121,cir_size,cir_size);
    painter.drawEllipse(60+60,60+191,cir_size,cir_size);
    painter.drawEllipse(60+260,60+221,cir_size,cir_size);
    painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+100)%255)));
    painter.drawEllipse(60+210,60+181,cir_size,cir_size);
    painter.drawEllipse(60+10,60+281,cir_size,cir_size);
    painter.drawEllipse(60+100,60+81,cir_size,cir_size);
 

}




void Scan::on_pushButton_clicked()
{
    m_angle=0;//将扫描动画重置并刷新数据,后面要将数据刷新的函数写在下面。
}

效果图,雷达右上角的图标对应着on_pushButton的点击事件右上角的图标对应着on_pushButton

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
使用Python的Qt库可以绘制扇形雷达扫描。首先,需要导入pyqtgraph模块,并创建一个Qt应用程序。 然后,创建一个QWidget窗口,将它设置为形视,并设置视的背景和大小。 接下来,定义一个函数来绘制扇形雷达扫描。在该函数中,可以使用QPainter来绘制扇形区域和线条。 首先,设置扇形区域的起始角度和跨越角度。然后,使用QPainterPath类来绘制一个扇形路径,并使用setPie方法将其绘制到窗口中。 接着,绘制扇形区域的边框线条。使用QPainter的drawArc方法来绘制一个圆弧,从起始角度开始,跨越到终止角度。 最后,将绘制的窗口显示出来。 下面是示例代码: ```python import sys import pyqtgraph as pg from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout from PyQt5.QtGui import QPainter, QPainterPath, QBrush, QColor class RadarScan(QWidget): def __init__(self): super().__init__() self.setWindowTitle('Radar Scan') self.resize(300, 300) self.graphicsView = pg.GraphicsView() layout = QHBoxLayout(self) layout.addWidget(self.graphicsView) self.setLayout(layout) self.plot() def plot(self): self.graphicsView.setBackground('w') self.graphicsView.setRange(xRange=[-150, 150], yRange=[-150, 150]) self.graphicsView.setAspectLocked() self.drawSector(0, 90, QColor(255, 0, 0)) def drawSector(self, start_angle, span_angle, color): painter = QPainter(self.graphicsView.viewport()) path = QPainterPath() path.moveTo(0, 0) path.arcTo(-150, -150, 300, 300, start_angle * 16, span_angle * 16) painter.setPen(color) painter.setBrush(QBrush(color)) painter.drawPath(path) painter.end() if __name__ == '__main__': app = QApplication(sys.argv) window = RadarScan() window.show() sys.exit(app.exec_()) ``` 这个示例代码演示了如何使用Python的Qt库来绘制一个扇形雷达扫描。其中,使用了QPainter和QPainterPath来控制绘过程,并使用QBrush和QColor来设置颜色。最后,使用pyqtgraph库的GraphicsView来显示绘制形。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值