1. 程式人生 > >QT與arduino互動實現雷達掃描效果

QT與arduino互動實現雷達掃描效果

我們前面用processing實現了雷達掃描效果,但processing畢竟不能用來做系統,不能作為一個比較完善的軟體釋出。這裡我們用QT來實現與arduino的互動及雷達掃描效果。
QT繪圖沒有基礎的,可以參考我部落格中的《QT零基礎繪圖》系列。

一、建立雷達掃描顯示工程及對話方塊
開啟qt選擇建立一個帶對話方塊的QApplication工程,命名工程名為QRadar
在這裡插入圖片描述
對話方塊名稱輸入QRadarDlg
在這裡插入圖片描述
二、程式碼實現
我們在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();
}

執行效果如下:
在這裡插入圖片描述
三、總結
1、相對於processing來說,我們可以更好的控制窗體以及畫面,比如我們點選start就可以啟動掃描,點選停止就可以終止掃描,介面友好更加容易實現。

2、如果我們需要在拖動視窗大小的同時,畫面自動適應匹配,那麼就需要實現虛擬函式resizeEvent,這裡就不重點描述,效果如下:
在這裡插入圖片描述
3、我們這裡採用的是timer來實現的影象實時重新整理,實際timer的本質也就是一個執行緒,我們也可以直接用QThread來實現我們的圖形實時重新整理,有興趣的小夥伴可以自己試試。

4、程式到上面的效果後,接下來就是完善掃描線的拖影效果以及模擬掃描目標點的顯示效果。這個可以參看我的部落格《一步一步用processing與arduino實現雷達掃描(2)》。
如果我們還有需求的話,可以加入一個控制面板在左邊,或者在左邊再增加一個波形圖分析,那麼這就很高大上了。與arduino的資料對接及聯調,準備在下一篇中進一步完善它。請有需要的小夥伴們關注我的部落格。