我们前面用processing实现了雷达扫描效果,但processing毕竟不能用来做系统,不能作为一个比较完善的软件发布。这里我们用QT来实现与arduino的互动及雷达扫描效果。
QT绘图没有基础的,可以参考我博客中的《QT零基础绘图》系列。

一、建立雷达扫描显示工程及对话框

打开qt选择建立一个带对话框的QApplication工程,命名工程名为QRadar

unity使用雷达拖拽鼠标_实时绘图


对话框名称输入QRadarDlg

unity使用雷达拖拽鼠标_实时绘图_02


二、代码实现

我们在qradardlg中实现虚函数paintEvent,并且用一个timer来实时刷新扫描线,当然,我们也可以增加两个按钮来控制扫描的开始和停止(这个可以省略),代码如下:

qradardlg.h

#define QRADARDLG_H

#include <QDialog>

namespace Ui {
class QRadarDlg;
}

class QRadarDlg : public QDialog
{
    Q_OBJECT

public:
    explicit QRadarDlg(QWidget *parent = 0);
    ~QRadarDlg();
    void paintEvent( QPaintEvent *e );
     QTimer *timer;

private slots:

    void timerRefresh();
    void on_startBtn_clicked();
    void on_stopBtn_clicked();

private:
    Ui::QRadarDlg *ui;
};

#endif // QRADARDLG_H

qradardlg.cpp

#include "qradardlg.h"
#include "ui_qradardlg.h"
#include "QPainter"
#include "QtCore"

float centerX=200;
float centerY=150;
float Radius=100;
float a=0;
const float PI=3.1415926;


QRadarDlg::QRadarDlg(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QRadarDlg)
{
    timer = new QTimer;
    //使timer出发的信息与槽timerRefresh绑定
    connect(timer,SIGNAL(timeout()),this,SLOT(timerRefresh()));
    ui->setupUi(this);
}

QRadarDlg::~QRadarDlg()
{

    delete ui;
    delete timer;

}

void QRadarDlg::paintEvent( QPaintEvent *e )
{
    QPainter painter(this);

    painter.setPen(QPen(Qt::green));

    //扫描线
    painter.drawLine(centerX,centerY,centerX+Radius*cos(a),centerY+Radius*sin(a));

    //绘制坐标
     for(int i=0;i<4;i++)
     {
         painter.drawLine(centerX,centerY,centerX+Radius*cos(i*PI/2),centerY+Radius*sin(i*PI/2));
     //绘制标尺
         for(int t=0;t<5;t++)
             painter.drawText(centerX+(Radius-t*Radius/5)*cos(i*PI/2),centerY+(Radius-t*Radius/5)*sin(i*PI/2),QString::number((5-t)*50));
    }
     //绘制同心圆
     for(int c=0;c<5;c++)
     {
          painter.setOpacity(0.1+c*0.05);
          painter.setBrush(Qt::green);
          painter.drawEllipse(QPoint(centerX,centerY),Radius-c*Radius/5,Radius-c*Radius/5);
     }

}

void QRadarDlg::timerRefresh()
{
    //角度自加
    a=a+0.0243;
    //调用upate,强制PaintEvent被调用刷新界面
    this->update();
}
void QRadarDlg::on_startBtn_clicked()
{
      timer->start(30);
}

void QRadarDlg::on_stopBtn_clicked()
{
     timer->stop();
}

运行效果如下:

unity使用雷达拖拽鼠标_QTimer实例_03


三、总结

1、相对于processing来说,我们可以更好的控制窗体以及画面,比如我们点击start就可以启动扫描,点击停止就可以终止扫描,界面友好更加容易实现。2、如果我们需要在拖动窗口大小的同时,画面自动适应匹配,那么就需要实现虚函数resizeEvent,这里就不重点描述,效果如下:

unity使用雷达拖拽鼠标_unity使用雷达拖拽鼠标_04


3、我们这里采用的是timer来实现的图像实时刷新,实际timer的本质也就是一个线程,我们也可以直接用QThread来实现我们的图形实时刷新,有兴趣的小伙伴可以自己试试。

4、程序到上面的效果后,接下来就是完善扫描线的拖影效果以及模拟扫描目标点的显示效果。这个可以参看我的博客《一步一步用processing与arduino实现雷达扫描(2)》。
如果我们还有需求的话,可以加入一个控制面板在左边,或者在左边再增加一个波形图分析,那么这就很高大上了。与arduino的数据对接及联调,准备在下一篇中进一步完善它。请有需要的小伙伴们关注我的博客。