#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QScrollArea>
#include <QScrollBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
comboBox_config();
this->setWindowTitle("毫米雷达波测距");
}
//基本配置
void Widget::comboBox_config()
{
/*第一部分:网络配置*/
//1.1配置协议
ui->comboBox_protocol->addItem("TCP Server");
//1.2获取并配置本地IP地址
QList<QHostAddress> list = QNetworkInterface::allAddresses();
for(int i=0;i<list.count();i++)
{
QHostAddress addr=list.at(i);
if(addr.protocol() == QAbstractSocket::IPv4Protocol)
{
ui->comboBox_address->addItem(addr.toString());
}
}
//1.3设置可编辑性
ui->comboBox_address->setEditable(true);
//1.4设置默认端口号
ui->lineEdit_port->setText("8080");
}
Widget::~Widget()
{
delete ui;
}
/*日志显示*/
void Widget::ss_log(QString text)
{
qDebug()<<text;
QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_log;
//设置只读
if(!plainTextEdit_log->isReadOnly())
{
plainTextEdit_log->setReadOnly(true);
}
//设置光标到文本末尾
plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
plainTextEdit_log->insertPlainText(text);
//移动滚动条到底部
QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
if(scrollbar)
{
scrollbar->setSliderPosition(scrollbar->maximum());
}
}
void Widget::on_pushButton_connect_clicked()
{
if(ui->pushButton_connect->text()=="打开服务器")
{
NewServer();
ss_log("已开启服务器\n");
}
else
{
ui->pushButton_connect->setText("打开服务器");
for(int i=0;i<TcpFarClientList.count();i++)
{
TcpFarClientList.at(i)->close();
TcpFarClientList.removeAt(i);
}
LocalTcpServer->close();//关闭服务器
ss_log("已关闭服务器\n");
ui->comboBox_address->setEditable(true);
ui->comboBox_protocol->setEditable(true);
ui->lineEdit_port->setEnabled(true);
}
}
//服务器模式:创建服务器
void Widget::NewServer()
{
/*1.实例化服务器*/
LocalTcpServer = new QTcpServer;
/*2.设置监听的端口和IP地址*/
quint16 port = QString(ui->lineEdit_port->text()).toInt();
if(ui->comboBox_address->currentText()=="QHostAddress::Any")
{
LocalTcpServer->listen(QHostAddress::Any,port);
}else
{
QHostAddress addr(ui->comboBox_address->currentText());
LocalTcpServer->listen(addr,port);
}
/*3.关联连接信号,检测是否有新的客户端连接*/
connect(LocalTcpServer,SIGNAL(newConnection()),this,SLOT(NewTcpConnection()));
ui->pushButton_connect->setText("断开连接");
//创建服务器之后设置控件不可用
ui->comboBox_address->setEditable(false);
ui->comboBox_protocol->setEnabled(false);
ui->lineEdit_port->setEnabled(false);
}
void Widget::on_comboBox_protocol_activated(int index)
{
switch(index)
{
case 0: //服务器模式
ui->label_address->setText("(2)本地IP地址");
ui->label_port->setText("(3)本地端口号");
ui->comboBox_address->clear();
ui->comboBox_address->addItem("QHostAddress::Any");
break;
}
QList<QHostAddress> list = QNetworkInterface::allAddresses();
for(int i=0;i<list.count();i++)
{
QHostAddress addr=list.at(i);
if(addr.protocol() == QAbstractSocket::IPv4Protocol)
{
ui->comboBox_address->addItem(addr.toString());
}
}
}
//服务器模式:响应新连接的客户端
void Widget::NewTcpConnection()
{
/*创建本地服务器套接字*/
QTcpSocket *ServerSocket=LocalTcpServer->nextPendingConnection();
/*关联可读信号*/
connect(ServerSocket,SIGNAL(readyRead()),this,SLOT(ReadTcpClientData()));
/*关联断开信号*/
connect(ServerSocket,SIGNAL(disconnected()),this,SLOT(TcpClientDisconnected()));
ss_log("设备已连接\n");
}
//服务器模式:响应断开的客户端
void Widget::TcpClientDisconnected()
{
ss_log("设备已断开\n");
for(int i=0;i<TcpFarClientList.count();i++)
{
//取出地址列表中的一个客户端地址
QTcpSocket *item = TcpFarClientList.at(i);
//判断该客户端是否已经断开
if(item->socketDescriptor()==-1)
{
TcpFarClientList.removeAt(i);
}
}
}
//服务器模式:读数据
void Widget::ReadTcpClientData()
{
ss_log("接收到新的测量数据\n");
for(int i=0;i<TcpFarClientList.count();i++)
{
if(!TcpFarClientList.at(i)->atEnd())
{
QByteArray array=TcpFarClientList.at(i)->readAll();
//记录接收的字节数并显示
QString text;
text+=QString("").fromLocal8Bit(array);
ui->plainTextEdit_ShowData->appendPlainText(QString("测量结果为:%1cm").arg(text));
ss_log(QString("当前测量距离为:%1cm\n").arg(text));
}
}
}
基于QT的距离传输上位机
需积分: 3 179 浏览量
2023-03-20
20:52:44
上传
评论
收藏 914KB RAR 举报
xpuhyy
- 粉丝: 3
- 资源: 9
最新资源
- Screenshot_20240430_144340_com.ss.android.ugc.live.jpg
- 回到山沟沟.mp3
- 基于matlab实现自适应波束形成RLS及LMS算法仿真源程序1.rar
- 基于matlab实现自己编写的基于卡尔曼滤波的利用加速度传感器的计步器,测试数据是传感器放在腰部和手臂 .rar
- 基于matlab实现阵列信号处理,波束形成.rar
- 111111111111111111
- 基于matlab实现计步器编程;对当前的计步器装置的数值算法模拟 .rar
- Mdb学习查看PW;access;mdb;pw;password;patch
- 基于matlab实现关于语音信号声源定位DOA估计所用的一些传统算法.rar
- 基于ultralytics-yolov8, 将其检测/分类/分割/姿态等任务移植到rk3588上
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈