我们前面用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的数据对接及联调,准备在下一篇中进一步完善它。请有需要的小伙伴们关注我的博客。