头文件
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QTcpSocket>QT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_logIn_clicked();void connected_slot();void on_font_clicked();void readyRead_slot();void on_dis_clicked();void disconnected_slot();private:Ui::Widget *ui;//实例化客户端指针QTcpSocket *socket;QString userName;QString my_msg;};#endif // WIDGET_H
源文件
#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->msg->setEnabled(false);ui->font->setEnabled(false);ui->dis->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_logIn_clicked(){//获取ui界面上的ip和端口号QString ip = ui->IP->text();//将字符型转成整形quint16 port = ui->PORT->text().toInt();//服务器的IP号,端口号socket->connectToHost(ip,port);}void Widget::connected_slot(){userName = ui->user->text();QString Msg = userName+":进入聊天室 >v< ";//将信息发送到服务器socket->write(Msg.toLocal8Bit());ui->msg->setEnabled(true);ui->font->setEnabled(true);ui->dis->setEnabled(true);ui->user->setEnabled(false);ui->IP->setEnabled(false);ui->PORT->setEnabled(false);ui->logIn->setEnabled(false);}//发送按钮对应的槽函数void Widget::on_font_clicked(){//获取ui界面上的文本QString Msg = userName +":"+ui->msg->text();QListWidgetItem *p = new QListWidgetItem(Msg);p->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(p);//将信息发送给服务器socket->write(Msg.toLocal8Bit());//清空输入框ui->msg->clear();}void Widget::readyRead_slot(){//读取服务器发送的数据QByteArray msg = socket->readAll();//将读到的数据放到ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));}//断开连接void Widget::on_dis_clicked(){QString msg = userName + ":离开聊天室>-<";socket->write(msg.toLocal8Bit());//断开与服务器的链接socket->disconnectFromHost();}void Widget::disconnected_slot(){ui->msg->setEnabled(false);ui->font->setEnabled(false);ui->dis->setEnabled(false);ui->user->setEnabled(true);ui->IP->setEnabled(true);ui->PORT->setEnabled(true);ui->logIn->setEnabled(true);}