利用Qt绘制雷达扫描效果

话不多说直接上代码,代码规范性可能差了点,但是效果得以实现,在这里记录一下。

scan.h的代码如下

  1. #ifndef SCAN_H
  2. #define SCAN_H
  3.  
  4. #include <QWidget>
  5. #include <QPainter>
  6. #include <QTime>
  7. #include <QTimer>
  8. #include <QDebug>
  9. #include <QPoint>
  10. #include <QtMath>
  11.  
  12. namespace Ui {
  13. class Scan;
  14. }
  15. class Scan : public QWidget
  16. {
  17.      Q_OBJECT
  18. public:
  19.      explicit Scan(QWidget *parent = nullptr);
  20.      ~Scan();
  21. public slots:
  22.      void timerTimeOut();
  23. protected:
  24.      void paintEvent(QPaintEvent *event) override;
  25. private slots:
  26.      void on_pushButton_clicked();
  27. private:
  28.      Ui::Scan *ui;
  29. };
  30. #endif // SCAN_H

scan.cpp的代码如下

  1. #include “scan.h”
  2. #include “ui_scan.h”
  3. QTimer *timer = new QTimer();
  4. int m_angle=0;
  5. int alpha=0;
  6. double cir_size=5;
  7. Scan::Scan(QWidget *parent) :
  8.      QWidget(parent),
  9.      ui(new Ui::Scan)
  10. {
  11.      ui->setupUi(this);
  12.      setPalette(Qt::black); setAutoFillBackground(true);//强制设置背景颜色为黑色
  13.      connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeOut()));//用槽函数控制雷达扫描效果。
  14.      timer->start(10);
  15.  
  16.  
  17. }
  18.  
  19. Scan::~Scan()
  20. {
  21.      delete ui;
  22. }
  23.  
  24. void Scan::timerTimeOut()
  25. {
  26.      timer->start(10);
  27.      if(m_angle<-360){
  28.          m_angle=0;
  29.      }//实现无缝连接,且保证m_angle的值不会溢出
  30.      if(alpha>=255){
  31.          alpha = 0;
  32.      }
  33.      if(cir_size>10){
  34.          cir_size=5;
  35.      }
  36.      update();
  37. }
  38. void Scan::paintEvent(QPaintEvent *event)//此函数自动执行,实现扫描动画效果
  39. {
  40.      Q_UNUSED(event);
  41.      QPainter painter(this);
  42.      QPen pen;
  43.      painter.setRenderHint(QPainter::Antialiasing);
  44.      painter.setPen(QPen(qRgba(128, 255, 0,250)));
  45.  
  46.      //网格改成坐标系
  47.      int x=280;//原本为240,右移40,下移60
  48.      int y=300;
  49.      /** 直径按照480处理 每隔40px画一个圆 绘制雷达图**/
  50.      QPoint center(x,y);
  51.      painter.drawEllipse(center,240,240);
  52.      painter.drawEllipse(center,24048,24048);
  53.      painter.drawEllipse(center,24096,24096);
  54.      painter.drawEllipse(center,240144,240144);
  55.      painter.drawEllipse(center,240192,240192);
  56.      /** 画外圈刻度值,将坐标系移动到圆心 **/
  57.      painter.translate(x,y);
  58.      painter.setPen(QPen(qRgba(255, 255, 0,250)));
  59.      painter.setFont(QFont(“Calibri”,10));
  60.      for(int i=1;i<=360;i++){
  61.              painter.rotate(1);
  62.              painter.drawLine(0,-240,0,-235);
  63.      }
  64.      for(int i=1;i<=72;i++){
  65.          painter.rotate(5);
  66.          painter.drawLine(0,-240,0,-232);
  67.      }
  68.      for(int i=1;i<=36;i++){
  69.          painter.setRenderHint(QPainter::Antialiasing);
  70.          painter.rotate(10);
  71.          painter.drawLine(0,-240,0,-228);
  72.      }
  73.      for(int i=1;i<=4;i++){
  74.          painter.rotate(90);
  75.          painter.drawLine(0,-240,0,-168);
  76.      }
  77.      painter.translate(-x,-y);//恢复坐标系
  78.      /** 绘制扫描效果 **/
  79.      QConicalGradient gradient(x, y, m_angle + 360);
  80.      gradient.setColorAt(0.1, QColor(128, 255, 0, 150));
  81.      gradient.setColorAt(0.7, QColor(0, 255, 0, 0));//尾部
  82.      painter.setBrush(gradient);
  83.      painter.setPen(QPen(Qt::NoPen));//去掉外框线
  84.      if (width() > height()){
  85.          painter.drawpie(40, 60, 480, 480, m_angle * 16, 360 * 16);
  86.      }
  87.      else{ painter.drawPie(40, 60, 480, 480, m_angle * 16, 360 * 16);}
  88.      m_angle -= 1;//每次旋转1度
  89.      alpha +=2;
  90.      cir_size+=0.01;
  91.  
  92.      //模拟画出可疑点
  93.      painter.setBrush(QBrush(QColor(50, 255, 200,alpha)));
  94.      painter.drawEllipse(0,0,15,15);
  95.      painter.drawEllipse(60+120,60+161,cir_size,cir_size);
  96.      painter.drawEllipse(60+240,60+161,cir_size,cir_size);
  97.      painter.drawEllipse(60+300,60+300,cir_size,cir_size);
  98.      painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+50)%255)));
  99.      painter.drawEllipse(60+160,60+121,cir_size,cir_size);
  100.      painter.drawEllipse(60+60,60+191,cir_size,cir_size);
  101.      painter.drawEllipse(60+260,60+221,cir_size,cir_size);
  102.      painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+100)%255)));
  103.      painter.drawEllipse(60+210,60+181,cir_size,cir_size);
  104.      painter.drawEllipse(60+10,60+281,cir_size,cir_size);
  105.      painter.drawEllipse(60+100,60+81,cir_size,cir_size);
  106.  
  107. }
  108.  
  109.  
  110.  
  111.  
  112. void Scan::on_pushButton_clicked()
  113. {
  114.      m_angle=0;//将扫描动画重置并刷新数据,后面要将数据刷新的函数写在下面。
  115. }

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

-1

到此这篇关于利用Qt绘制雷达扫描效果的文章就介绍到这了,更多相关Qt雷达扫描内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

标签

发表评论