本文主要是介绍QT实现客户端断开连接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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->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);}Widget::~Widget()
{delete ui;
}//连接按钮对应的槽函数处理
void Widget::on_connectBtn_clicked()
{//获取到ui界面上的 Ip和端口号QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt(); //将字符串转换整型//客户端连接服务器//函数原型://virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);socket->connectToHost(ip, port);//如果成功连接到服务器,那么客户端就会自动发射一个connected信号//我们就可以将该信号连接到自定义的槽函数中, 由于只需要连接一次,所以连接函数 写在构造函数中}//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->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);//如果服务器向客户端发来数据,那么客户端就会自动发射一个readyRead()信号//将该信号连接到自定义的槽函数中,读取数据, 由于只需要连接一次,那么连接函数写在构造函数中}//readyRead()信号对应的槽函数
void Widget::readyRead_slot()
{//读取数据QByteArray msg = socket->readAll();//将读取到的数据放入ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));}//发送按钮对应的槽函数处理
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();}
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpSocket> //客户端类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void on_sendBtn_clicked();void on_disconnectBtn_clicked();public slots:void connected_slot(); //connected对应槽函数声明void readyRead_slot(); //readyRead()信号对应的槽函数声明private:Ui::Widget *ui;//实例化一个客户端指针QTcpSocket *socket;//定义一个存储用户的变量QString userName;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
这篇关于QT实现客户端断开连接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!