思维导图
client.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
, socket(new QTcpSocket(this))//给客户端实例化分配空间
{ui->setupUi(this);
//初始化界面
ui->msgEdit->setEnabled(false);
ui->sendBtn->setEnabled(false);
ui->disconnectBtn->setEnabled(false);
//如果成功连接到服务器,客户端就会自动发射一个connected信号,由于只需要连接一次,所以连接函数写在构造函数中
connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
//我们可以将readyRead信号连接到自定义的槽函数,读取数据,由于只需要连接一次,所以连接函数写在构造函数中
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
//如果成功断开与服务器的连接,那么客户端就会自动发射一个disconnected信号,由于只需要连接一次,所以断开连接函数写在构造函数中
connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
Widget::~Widget()
{
delete ui;
}
//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
//让客户端连接服务器 字符串转换成无符号整型
socket->connectToHost(ui->IPEdit->text(),ui->PortEdit->text().toUInt());
}
//connected信号对应的槽函数
void Widget::connected_slot()
{
//告诉服务器,我这个客户端连接进来了
userName = ui->userNameEdit->text();
QString msg = userName+":进入聊天室";
//将信息发送给服务器
socket->write(msg.toLocal8Bit());
//接下来就将组件的可用不可用状态进行改变设置一下
ui->msgEdit->setEnabled(true);
ui->sendBtn->setEnabled(true);
ui->disconnectBtn->setEnabled(true);
ui->userNameEdit->setEnabled(false);
ui->IPEdit->setEnabled(false);
ui->PortEdit->setEnabled(false);
ui->connectBtn->setEnabled(false);
//程序运行到此,说明客户端与服务器成功建立连接,如果服务器发来数据,那么客户端就会自动发射一个readyRead信号
}
//readyRead信号对应的槽函数
void Widget::readyRead_slot()
{
//读取服务器发来的数据
QByteArray msg = socket->readAll();
QString s1 = QString::fromLocal8Bit(msg);
s1 = s1.mid(0,userName.size());//字符串截取用户名
if(s1 == userName)
{
//获取用户发出的消息内容
QString s2 = (QString::fromLocal8Bit(msg)).mid(userName.size()+1,(QString::fromLocal8Bit(msg)).size()-userName.size());
s2 = s2 + ":" + userName;
QListWidgetItem *item = new QListWidgetItem(s2);
item->setTextAlignment(Qt::AlignRight);//设置文本对齐方式为右对齐
ui->listWidget->addItem(item);
}
else
{
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}
}
//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{
ui->msgEdit->setEnabled(false);
ui->sendBtn->setEnabled(false);
ui->disconnectBtn->setEnabled(false);
ui->userNameEdit->setEnabled(true);
ui->IPEdit->setEnabled(true);
ui->PortEdit->setEnabled(true);
ui->connectBtn->setEnabled(true);
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{
//获取ui界面上要发送的信息
QString msg = ui->msgEdit->text();
msg = userName + ":" + msg;
//将信息发送给服务器
socket->write(msg.toLocal8Bit());
//清空行编辑器
ui->msgEdit->clear();
}
//断开连接按钮对应的槽函数
void Widget::on_disconnectBtn_clicked()
{
//告诉服务器,本大爷要离开了
QString msg = userName + ":离开聊天室";
//信息发送给服务器
socket->write(msg.toLocal8Bit());
//断开与服务器端的连接
socket->disconnectFromHost();
}