QUdpSocket实现聊天功能(事件过滤器、回车发送聊天内容)
一、介绍
使用QUdpSocket实现类似微信聊天功能,输入完聊天信息按回车键发送聊天内容,文中使用到注册事件过滤器方法,socket通讯没有服务端与客户端之分的,本文为了区分演示用,控件上取名字时取了服务端和客户端。其实它们的代码实现是一样的,只是监听的端口号不一样。
二、效果图
三、核心代码
#include "WidgetUdpClient.h"
#include "ui_WidgetUdpClient.h"
#include <QtNetwork/QHostAddress>
WidgetUdpClient::WidgetUdpClient(QWidget *parent) :
QWidget(parent),
ui(new Ui::WidgetUdpClient)
{
ui->setupUi(this);
// 注册事件过滤器
ui->textEditInput->installEventFilter(this);
// 初始化udpSocket,绑定监听端口号
m_pUdpSocket = new QUdpSocket(this);
m_pUdpSocket->bind(9999);
connect(m_pUdpSocket,SIGNAL(readyRead()),this,SLOT(dealRecvMsg()));
}
WidgetUdpClient::~WidgetUdpClient()
{
if(m_pUdpSocket != NULL)
{
m_pUdpSocket->close();
delete m_pUdpSocket;
m_pUdpSocket = NULL;
}
delete ui;
}
//************************************
// 函数名称:
// 函数说明:事件过滤器重写
// 返 回 值: void
// 作 者:ISmileLi
// 作成日期:
// 修改记录:
//************************************
bool WidgetUdpClient::eventFilter(QObject *object, QEvent *event)
{
if(object == ui->textEditInput)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if(keyEvent->key() == Qt::Key_Return)
{
QString ip = ui->lineEditIP->text();
quint16 port = ui->lineEditPort->text().toInt();
QString strData = ui->textEditInput->toPlainText();
m_pUdpSocket->writeDatagram(strData.toUtf8(),(QHostAddress)ip,port);
ui->textEditRecv->setTextColor("red");
if(!strData.isEmpty())
ui->textEditRecv->append("client:"+strData);
qDebug() << "client.......";
ui->textEditInput->clear();
return true;
}
return false;
}
else
return WidgetUdpClient::eventFilter(object, event);
}
//************************************
// 函数名称:
// 函数说明:接收数据
// 返 回 值: void
// 作 者:ISmileLi
// 作成日期:
// 修改记录:
//************************************
void WidgetUdpClient::dealRecvMsg()
{
char tempBuf[1024] = {0};
QHostAddress hostAddress;
quint16 port;
qint64 length = m_pUdpSocket->readDatagram(tempBuf,sizeof(tempBuf),&hostAddress,&port);
if(length > 0)
{
QString strMsg = QString("[%1-%2]:%3").arg(hostAddress.toString()).arg(port).arg(tempBuf);
ui->textEditRecv->setTextColor("cyan");
ui->textEditRecv->append("server:"+strMsg);
}
}
说明:由于代码一样,这里不在粘贴另一份代码(即服务器端)。如果需要源码请下载:
http://download.csdn.net/download/toby54king/10163410。
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi