QT与arduino互动实现雷达扫描效果
Qt 实现 效果 扫描 Arduino 互动 雷达
2023-09-27 14:27:33 时间
我们前面用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的数据对接及联调,准备在下一篇中进一步完善它。请有需要的小伙伴们关注我的博客。
相关文章
- Qt5的插件机制(1)--Qt 框架中的插件载入机制概述
- Qt 检验器 三种典型类的用法
- qt中使用socket套接字做tcp/Udp通信需要配置和引用的文件
- Qt创建动态库给C#调用,通过回调完成交互
- Qt-Focus事件处理,重写qpushbutton实现背景切换鼠标样式及eventFilter的用法
- 【QT】回调函数的实现
- 基于QT(C++)+SQL Server 2008 实现相机租赁系统【100010742】
- 基于QT(C++)+Sqlite3实现单词消除游戏系统【100010741】
- 基于QT(C++)实现(界面)即时通讯软件【100010661】
- 基于QT(C++)+SQLite实现(界面)Linux系统下的邮件收发软件【100010541】
- 基于QT(C++)实现(窗体)UDP文件原型【100010516】
- 基于QT(C++)实现(图形界面)应用密码学大作业【100010263】
- 基于QT(C++)OOP 实现(界面)酒店预订与管理系统【100010195】
- Qt编写物联网管理平台38-多种数据库支持
- Qt编写的项目作品16-Onvif搜索和云台控制工具
- Qt编写自定义控件70-扁平化flatui
- Qt编写控件属性设计器7-串口采集
- 自己用纯C++实现简单的QT中信号与槽机制
- QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
- Qt的一些开发技巧
- Qt Roadmap for 2018(对3D有很多改进)
- Qt之二维码扫描
- Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实
- QT QCharts QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失
- Qt 使用Poppler实现pdf阅读器