Qt UDP通信学习

Qt UDP通信学习

一、项目概述

本项目基于Qt框架实现了UDP通信功能,支持单播与广播消息收发,展示了UDP套接字的基本用法,适合初学者学习Qt网络模块的实际应用。

二、项目结构

  • 55.pro:Qt工程文件,配置模块与源码文件
  • main.cpp:程序入口,初始化应用与主窗口
  • widget.h / widget.cpp:主窗口类,包含UI与核心逻辑
  • widget.ui:界面文件(未展示,需在Qt Designer中查看)

三、环境配置

  • Qt 5.x及以上
  • 启用network、widgets模块
  • C++11支持

四、核心代码详解

1. main.cpp

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

2. widget.h

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    Ui::Widget *ui;           // UI指针
    QUdpSocket *udpSocket;    // UDP套接字对象
private slots:
    void readPendingDatagrams();      // 接收数据槽
    void on_pushButton_3_clicked();   // 单播发送按钮槽
    void on_pushButton_clicked();     // 绑定端口按钮槽
    void on_pushButton_2_clicked();   // 解除绑定按钮槽
    void on_pushButton_4_clicked();   // 广播发送按钮槽
    void mStateChanged(QAbstractSocket::SocketState); // 状态变化槽
};
#endif // WIDGET_H

3. widget.cpp

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    udpSocket = new QUdpSocket(this);
    ui->pushButton_2->setEnabled(false);
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
    connect(udpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
Widget::~Widget()
{
    delete ui;
}
void Widget::readPendingDatagrams()
{
    QByteArray tmpByteArray;
    tmpByteArray.resize(udpSocket->pendingDatagramSize());
    QHostAddress ipaddr;
    quint16 port;
    while (udpSocket->hasPendingDatagrams()) {
        udpSocket->readDatagram(tmpByteArray.data(), tmpByteArray.size(), &ipaddr, &port);
        ui->textBrowser->append("接收来自:" + ipaddr.toString() + ":" + QString::number(port) + tmpByteArray);
    }
}
void Widget::on_pushButton_3_clicked()
{
    ui->textBrowser->append("发送:" + ui->lineEdit->text());
    udpSocket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress("127.0.0.1"), 7755);
}
void Widget::on_pushButton_clicked()
{
    ui->pushButton->setEnabled(false);
    ui->pushButton_2->setEnabled(true);
    udpSocket->bind(8888);
}
void Widget::on_pushButton_2_clicked()
{
    udpSocket->abort();
    ui->pushButton->setEnabled(true);
    ui->pushButton_2->setEnabled(false);
}
void Widget::on_pushButton_4_clicked()
{
    ui->textBrowser->append("发送:" + ui->lineEdit->text());
    udpSocket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress::Broadcast, 7755);
}
void Widget::mStateChanged(QAbstractSocket::SocketState socketState)
{
    switch (socketState) {
        case QAbstractSocket::BoundState:
        ui->textBrowser->append("socket状态BoundState");
    default:
        break;
    }
}
相关推荐
blasit2 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
范特西.i5 天前
QT聊天项目(8)
开发语言·qt
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习