connect(udpSocket,&QUdpSocket::readyRead,this,&exchange::ReceiveMessage); //点击退出按钮 实现关闭窗口 connect(ui->exitBtn,&QPushButton::clicked,[=](){ this->close(); }); }
时间: 2024-04-02 11:33:23 浏览: 167
这段代码是在上一个问题的代码后面,它通过connect函数将udpSocket对象的readyRead信号与exchange对象的ReceiveMessage函数进行了连接。当udpSocket对象接收到数据时,就会触发readyRead信号,并调用ReceiveMessage函数进行处理。同时,它还连接了exitBtn按钮的clicked信号,使得在点击退出按钮时,会调用close函数关闭当前窗口。
相关问题
Widget::Widget(QWidget *parent ,QString name) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); myname=name; this->port=1314; this->udpScoket= new QUdpSocket(this); udpScoket->bind(port,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint); //监听信号 connect(udpScoket,&QUdpSocket::readyRead,this,&Widget::ReceiveMessage); //连接发送按钮 connect(ui->sendBtn,&QPushButton::clicked,[=](){ sndMsg(Msg); }); //新用户进入 sndMsg(UserEnter); connect(ui->exitBtn,&QPushButton::clicked,[=](){ this->close(); }); //字体设置 类型 大小 connect(ui->fontCbx,&QFontComboBox::currentFontChanged,[=](const QFont &font){ ui->msgTxtEdit->setFontFamily(font.toString()); ui->msgTxtEdit->setFocus(); });
这段代码创建了一个名为 Widget 的 QWidget 对象,并将其继承自 QWidget 类。在构造函数中,首先调用了 `ui->setupUi(this)` 函数来初始化 UI 界面。然后通过 `myname` 变量来保存用户名,设置了默认的端口号为 1314,并创建了一个 QUdpSocket 对象用于进行 UDP 通信,绑定了端口号并设置了共享地址和重用地址选项。接着通过 `connect()` 函数连接了 `readyRead` 信号和 `Widget::ReceiveMessage()` 槽函数,用于接收 UDP 数据包。然后连接了发送按钮的 `clicked` 信号和 `sndMsg()` 槽函数,用于发送消息。当用户进入聊天室时,也会自动发送一个 UserEnter 消息。最后连接了字体选择框的 `currentFontChanged()` 信号和匿名函数,用于设置当前输入框的字体。
添加或更改这段.h和.cpp代码使QT UDP发送的内容在C++控制台输出#include "UdpServer.h" UdpServer::UdpServer(QObject *parent) : QObject(parent) { initServer(); } UdpServer::~UdpServer() { } void UdpServer::initServer() { m_socket = new QUdpSocket(this); QObject::connect(m_socket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams); m_socket->bind(6666, QUdpSocket::ShareAddress); } void UdpServer::readPendingDatagrams() { QByteArray arr; while (m_socket->hasPendingDatagrams()) { arr.resize(m_socket->bytesAvailable()); m_socket->readDatagram(arr.data(), arr.size(),&m_addr,&m_port); qDebug() << arr; } } #ifndef UDPSERVER_H #define UDPSERVER_H #include <QObject> #include <QUdpSocket> class UdpServer : public QObject { Q_OBJECT public: UdpServer(QObject *parent = nullptr); ~UdpServer(); private: void initServer(); private slots: void readPendingDatagrams(); private: QUdpSocket *m_socket; QHostAddress m_addr; quint16 m_port; }; #endif //UDPSERVER_H
下面是修改后的代码,将接收到的数据输出到控制台:
UdpServer.h
#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QObject>
#include <QUdpSocket>
class UdpServer : public QObject
{
Q_OBJECT
public:
UdpServer(QObject *parent = nullptr);
~UdpServer();
private:
void initServer();
private slots:
void readPendingDatagrams();
signals:
void dataReceived(const QByteArray& data); // 新增信号
private:
QUdpSocket *m_socket;
QHostAddress m_addr;
quint16 m_port;
};
#endif // UDPSERVER_H
UdpServer.cpp
#include "UdpServer.h"
#include <QDebug>
UdpServer::UdpServer(QObject *parent)
: QObject(parent)
{
initServer();
}
UdpServer::~UdpServer()
{
}
void UdpServer::initServer()
{
m_socket = new QUdpSocket(this);
QObject::connect(m_socket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);
m_socket->bind(6666, QUdpSocket::ShareAddress);
}
void UdpServer::readPendingDatagrams()
{
QByteArray arr;
while (m_socket->hasPendingDatagrams())
{
arr.resize(m_socket->pendingDatagramSize());
m_socket->readDatagram(arr.data(), arr.size(), &m_addr, &m_port);
qDebug() << arr;
emit dataReceived(arr); // 发送信号
}
}
在UdpServer类中添加了一个新的信号dataReceived,在readPendingDatagrams()函数中接收到数据后发送该信号,用于在外部处理接收到的数据。在控制台输出数据的代码不变,仅添加了信号的处理。
阅读全文