widget.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->lineEdit->setEnabled(false);
ui->pushButton->setEnabled(false);
ui->pushButton_3->setEnabled(false);
connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
//如果服务器向客户端发来数据,那么客户端会自动发射一个readyRead()信号
//我们就可以将该信号连接到自定义的槽函数中,读取服务器发来的数据,由于只需要连接一次,所以连接
connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_2_clicked()
{
//获取ui界面上的ip和端口
QString ip = ui->lineEdit_3->text();
quint16 port = ui->lineEdit_4->text().toUInt();
//让客户端连接服务器
socket->connectToHost(ip,port);
//如果客户端成功连接服务器,那么客户端就会自动发射一个connected()信号
}
void Widget::connected_slot()
{
username = ui->lineEdit_2->text();
//告诉服务器,我来了
QString msg = username+"进入聊天室";
//将信息发送给服务器
socket->write(msg.toLocal8Bit());
ui->lineEdit->setEnabled(true);
ui->pushButton->setEnabled(true);
ui->pushButton_3->setEnabled(true);
ui->lineEdit_2->setEnabled(false);
ui->pushButton_2->setEnabled(false);
ui->lineEdit_3->setEnabled(false);
ui->lineEdit_4->setEnabled(false);
}
void Widget::on_pushButton_clicked()
{
//获取ui界面上的文本
msg1 = username+":"+ui->lineEdit->text();
//将信息发送给服务器
socket->write(msg1.toLocal8Bit());
//清空
ui->lineEdit->clear();
}
void Widget::readyRead_slot()
{
//读取服务器发来的数据
QByteArray msg = socket->readAll();
if(msg1 == QString::fromLocal8Bit(msg))
{
QListWidgetItem *item =new QListWidgetItem(ui->listWidget);
item->setText(QString::fromLocal8Bit(msg));
item->setTextAlignment(Qt::AlignRight);
ui->listWidget->addItem(item);
}
else
{
//将读取到的信息放到ui界面上
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}
}
void Widget::on_pushButton_3_clicked()
{
//告诉服务器,再见
QString msg = username+"灰心的离开了,他踉跄地走了两步,回头望了一眼,低沉的嗓音响起,如果可以的话,以后,,算了,大概是没有如果,也没有以后了,好像也不用大概";
//断开与服务器的连接
socket->write(msg.toLocal8Bit());
socket->disconnectFromHost();
//
}
void Widget::disconnected_slot()
{
ui->lineEdit->setEnabled(false);
ui->pushButton->setEnabled(false);
ui->pushButton_3->setEnabled(false);
ui->lineEdit_2->setEnabled(true);
ui->pushButton_2->setEnabled(true);
ui->lineEdit_3->setEnabled(true);
ui->lineEdit_4->setEnabled(true);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QListWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_2_clicked();
void connected_slot();
void on_pushButton_clicked();
void readyRead_slot();
void on_pushButton_3_clicked();
void disconnected_slot();
private:
Ui::Widget *ui;
QTcpSocket *socket;
//定义存放用户名的变量
QString username;
QString msg1;
};
#endif // WIDGET_H