练习. 基于TCP聊天室的客户端
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_sendBtn_clicked();
void on_connectBtn_clicked();
void connectedSlot();
void readInfoSlot();
void disconnectSlot();
private:
Ui::Widget *ui;
QTcpSocket *socket;
QString username;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
ui->usernameEdit->setText("kk");
ui->ipEdit->setText("192.168.2.107");
ui->portEdit->setText("6667");
connect(socket, &QTcpSocket::connected, this, &Widget::connectedSlot);
connect(socket, &QTcpSocket::readyRead, this, &Widget::readInfoSlot);
connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnectSlot);
}
//连接成功回调
void Widget::connectedSlot()
{
QMessageBox::information(this, "提醒", "连接成功");
QString msg = username + ":进入聊天室";
socket->write(msg.toLocal8Bit());
}
//断开连接回调
void Widget::disconnectSlot()
{
QMessageBox::information(this, "提醒", "断开连接成功");
}
//接收服务器信息
void Widget::readInfoSlot() {
//判断是否有可读数据
if (socket->bytesAvailable() != 0) {
QString msg = QString::fromLocal8Bit(socket->readAll());
ui->listWidget->addItem(msg);
}
}
//Button Event
//发送按钮
void Widget::on_sendBtn_clicked()
{
socket->write(ui->textEdit->text().toLocal8Bit());
}
//连接服务器按钮
void Widget::on_connectBtn_clicked()
{
QString ip = ui->ipEdit->text();
quint16 port = ui->portEdit->text().toUShort();
username = ui->usernameEdit->text();
if (ui->connectBtn->text() == "连接服务器") {
//连接服务器
socket->connectToHost(ip, port);
ui->connectBtn->setText("断开服务器");
} else {
//断开服务器
QString msg = username + ": 离开聊天室";
socket->write(msg.toLocal8Bit());
socket->disconnectFromHost();
//当客户端断开后,发送disconnected的信号
ui->connectBtn->setText("连接服务器");
}
}
Widget::~Widget()
{
delete ui;
}