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的資料對接及聯調,準備在下一篇中進一步完善它。請有需要的小夥伴們關注我的部落格。