QT学习day5(QT实现TCP协议)

作业:利用TCP客户端和服务器实现网络聊天室(简单版QQ)

1.服务器代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpServer>            //服务器头文件
#include<QTcpSocket>             //客户端头文件
#include<QList>                  //链表容器
#include<QMessageBox>            //消息对话框
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void newConnection_slot();          //自定义处理newConnection信号的槽函数的声明void readyRead_slot();              //自定义处理readyRead信号的槽函数的声明private:Ui::Widget *ui;//实例化服务对象QTcpServer *server;//实例化一个服务器对象//创一个存放客户端的套接字的容器QList<QTcpSocket *> clientList;
};
#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->msgEdit->setEnabled(false);ui->setBtn->setEnabled(false);ui->disBtn->setEnabled(false);//判断是否连接成功,如果连接成功客户端会自动发射connected,将该信号连接到自定义的槽函数中处理相关的逻辑//因为只需要连接一次,所以我们将连接函数写在构造函数中connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//定义在构造函数是为了只连接一次//此时说明服务器和客户端此时已经建立好连接,如果服务器发来数据,该客户端会自动发射readRead信号connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//判断是否断开成功,如果成功断开连接,客户端自动发射disconnect信号connect(socket,&QTcpSocket::disconnected,this,&Widget::dis_slot);}Widget::~Widget()
{delete ui;
}//链接服务器按钮对应的槽函数
void Widget::on_connectStn_clicked()
{//获取ui界面上的IP和端口号uesrName=ui->usrnameEdit->text();QString ip= ui->ipEdit->text();quint16 port=ui->portEdit->text().toUInt();//转换成整型//客户端连接链接服务器socket->connectToHost(ip,port);}
//连接成功对应的槽函数实现
void Widget::connected_slot()
{//告诉服务器 我来了QString msg = uesrName + ":进入聊天室";//将信息发送给服务器socket ->write(msg.toLocal8Bit());//将ui界面上的控价进行相关设置ui->usrnameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectStn->setEnabled(false);ui->msgEdit->setEnabled(true);ui->setBtn->setEnabled(true);ui->disBtn->setEnabled(true);}
void Widget::readyRead_slot()//readyread对应的槽函数
{//说明服务器给客户端发来数据QByteArray msg = socket->readAll();//将数据放入到ui界面中ui->listWidget->addItem(QString::fromLocal8Bit(msg));}void Widget::dis_slot()
{ui->usrnameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->connectStn->setEnabled(true);ui->msgEdit->setEnabled(false);ui->setBtn->setEnabled(false);ui->disBtn->setEnabled(false);}void Widget::on_setBtn_clicked()//发送按钮对应的槽函数处理
{//获取ui界面上的文本内容QString msg =uesrName+":"+ ui->msgEdit->text();//将信息发送给服务器socket->write(msg.toLocal8Bit());//将msg的文本清空ui->msgEdit->clear();}void Widget::on_disBtn_clicked()//断开按钮对应的槽函数处理
{QString msg = uesrName+":"+ "离开了聊天室,尔等也退下吧";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();}

服务器 ui界面:

 

2.客户端代码

second.h

#ifndef SECOND_H
#define SECOND_H#include <QWidget>
#include<QIcon>
#include<QTcpServer>//服务器头文件
#include<QTcpSocket>//客户端头文件
#include<QMessageBox>//消息对话框
#include<QDebug>//调试类namespace Ui {
class Second;
}class Second : public QWidget
{Q_OBJECT
public slots:void jump_slot();//接收跳转信号函数public:explicit Second(QWidget *parent = nullptr);~Second();private slots:void on_connectBtn_clicked();//链接服务器对应的槽函数声明void connected_solt();void readyRead_slot();void dis_slot();void on_sendBtn_clicked();void on_disBtn_clicked();private:Ui::Second *ui;//实例化一个客户端对象QTcpSocket *socket;//定义一个用户名的变量QString userName;
};#endif // SECOND_H

 

widget.h 

 

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QMovie>//动态图
#include<QPixmap>//图片
#include<QDebug>//输出
#include<QPushButton>//按钮类
#include<QMessageBox>//信息类
#include<QIcon>//图片QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
signals://自定义跳转信号函数void jump();private slots://void on_pushButton_2_clicked();void my_slot();//自己定义的槽函数private:Ui::Widget *ui;};
#endif // WIDGET_H

 

main.cpp

#include "widget.h"
#include"second.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//实例化第二个窗口的对象Second s;QObject::connect(&w,&Widget::jump,&s,&Second::jump_slot);return a.exec();
}

 

second.cpp

#include "second.h"
#include "ui_second.h"void Second::jump_slot()//跳转信号槽函数
{this->show();//将自己的界面进行展示
}Second::Second(QWidget *parent) :QWidget(parent),ui(new Ui::Second)
{ui->setupUi(this);//第二个界面的窗口设置this->setWindowTitle("划水摆烂群");this->setWindowIcon(QIcon(":/pictrue/eaeb1d87_E780070_63de2b7c.png"));//ui->listWidget->setStyleSheet("QListWidget { background-color: transparent; }");//设置背景为透明色//给客户端实例化空间socket =new QTcpSocket(this);//初始化界面(未连接服务器时)ui->msgEdit->setEnabled(false);//消息对话框不可用ui->sendBtn->setEnabled(false);//发送按钮不可用ui->disBtn->setEnabled(false);//离线不可用//判断是否连接成功,如果连接成功客户端会自动发射connected,将该信号连接到自定义的槽函数中处理相关的逻辑//因为只需要连接一次,所以我们将连接函数写在构造函数中connect(socket,&QTcpSocket::connected,this,&Second::connected_solt);//定义在构造函数是为了只连接一次//此时说明服务器和客户端此时已经建立好连接,如果服务器发来数据,该客户端会自动发射readRead信号connect(socket,&QTcpSocket::readyRead,this,&Second::readyRead_slot);}Second::~Second()
{delete ui;
}void Second::on_connectBtn_clicked()//链接服务器对应的槽函数
{//获取ui界面上的IP和端口号userName=ui->usernameEdit->text();//获取用户名QString ip=ui->ipEdit->text();//获取ipquint16 port=ui->portEdit_2->text().toUInt();//获取端口号//客户端连接服务器socket->connectToHost(ip,port);}void Second::connected_solt()//连接成功对应的槽函数
{//告诉服务器我上线了QString msg = userName + ":已上线";//将消息发送给服务器socket ->write(msg.toLocal8Bit());//重新设置ui界面上的控件ui->usernameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit_2->setEnabled(false);ui->connectBtn->setEnabled(false);ui->msgEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->disBtn->setEnabled(true);}void Second::readyRead_slot()
{//说明服务器给客户端发来数据QByteArray msg = socket->readAll();//将数据放入到ui界面中ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}void Second::dis_slot()
{ui->usernameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit_2->setEnabled(true);ui->connectBtn->setEnabled(true);ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disBtn->setEnabled(false);}
void Second::on_sendBtn_clicked()//发送按钮对应的槽函数
{//获取ui界面上的文本内容QString msg =userName+":"+ ui->msgEdit->text();//将信息发送给服务器socket->write(msg.toLocal8Bit());//将msg的文本清空ui->msgEdit->clear();}void Second::on_disBtn_clicked()//离线按钮对应的槽函数
{QString msg = userName+":"+ "离开了聊天室,尔等也退下吧";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();
}

 widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//窗口图标设计this->setWindowTitle("腾讯QQ");this->setWindowIcon(QIcon(":/pictrue/20573cf63610bed.jpg"));//连接登录Btn信号与槽connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::my_slot);ui->zhuceBtn->setStyleSheet("border:1px solid transparent;");ui->mimaBtn->setStyleSheet("border:1px solid transparent;");//取消边框/**********************标签设置****************************///设置标签背景(动态图)
//    QMovie *mv = new QMovie("/*************路径*************/");
//    ui->beijinglabel->setMovie(mv);
//    mv->start();//让标签自动使用标签ui->beijinglabel->setPixmap(QPixmap(":/pictrue/wKjg2lvGWoCAJlJxAADOBePmF24715.jpg"));ui->beijinglabel->setScaledContents(true);//设置左上角的标签
//    ui->qqlable->setPixmap(QPixmap(":/pictrue/20573cf63610bed.jpg"));
//    ui->qqlable->setScaledContents(true);
//    ui->qqlable->resize(30,30);//重新设置大小/**********************登录设置*******************************/}Widget::~Widget()
{delete ui;
}void Widget::my_slot()//登录按钮对应的槽函数
{QString userName =  ui->zhanghaoEdit->text();//获取账号QString passWord =  ui->mimaEdit->text();//获取密码//判断登录条件是否满足if(userName=="admin"&&passWord=="123456"){//满足登录条件跳转到聊天室页面
//        qDebug() << "deng";
//        this->close();emit jump();this->hide();//将自己的页面隐藏}else{// qDebug() << "";QMessageBox::information(this,"提示:","账号或密码错误请重新输入");//ui->zhanghaoEdit->clear();}}

second的ui界面 

widget的ui界面 

 

实现效果: 

运行出的窗口

 

 密码输入错误弹出的消息对话框和启动服务器成功界面

输入信息上线成功显示界面 

 消息发送成功界面

离线显示下线信息

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/145197.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 HarmonyOS 做一个可以手势控制的电子相册应用(ArkTS)

介绍 本篇 Codelab 介绍了如何实现一个简单的电子相册应用&#xff0c;主要功能包括&#xff1a; 1. 实现首页顶部的轮播效果。 2. 实现页面多种布局方式。 3. 实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 ● Swiper&#xff1a;滑块视图容…

2023年全球及中国半导体石英坩埚市场发展概况分析:未来需求量迅速增长[图]

2018年至2022年&#xff0c;全球半导体石英坩埚市场规模由10.4亿元增至18.2亿元&#xff0c;期间年复合增长率为15.1%。未来&#xff0c;随着集成电路行业的发展&#xff0c;下游芯片行业的需求将推动8吋及12吋半导体硅片出货量在未来将持续增长&#xff0c;同时半导体硅片厂的…

Vue3.3指北(一)

Vue3.3指北 1、Vue32、Vue3安装3、Vue指令3.1、配置准备1.1.1、WebStrom配置模板1.1.2、配置devtools1.1.3、Vue3指令概览 3.2、内容渲染指令3.2.1、mustache语法3.2.2、v-once1.3.2、v-text1.3.3、v-html1.3.4、v-pre1.3.5、v-cloak 3.3、属性绑定指令3.3.1、v-bind1、v-bind绑…

Excel函数中单元格的引用方式

如下图在D列第一行输入sum(A1:C1)&#xff1b; 回车之后结果如下&#xff1b;先要输入等号&#xff0c;然后输入sum&#xff0c;以及左括号&#xff0c;这是调用了sum求和函数&#xff1b; A1表示A列第一行&#xff0c;C1表示C列第一行&#xff1b; A1:C1&#xff0c;中间是冒号…

用 Java 在 PDF 中创建和管理图层,实现交互式文档

PDF 图层&#xff08;也称为可见图层或附加图层等&#xff09;是组织和管理 PDF 文档中内容可见性的一种方法。PDF 图层可用于创建交互式文档、隐藏或显示特定信息、创建多语言版本文档等。通过添加和删除图层&#xff0c;用户可以根据需要定制 PDF 文档指定内容的可见性与显示…

数据要素安全流通:挑战与解决方案

文章目录 数据要素安全流通&#xff1a;挑战与解决方案一、引言二、数据要素安全流通的挑战数据泄露风险数据隐私保护数据跨境流动监管 三、解决方案加强数据安全防护措施实施数据隐私保护技术建立合规的数据跨境流动机制 四、数据安全流通的未来趋势01 数据价值与产业崛起02 多…

项目经理之如何组建跨部门项目团队

在跨组织、跨部门、跨专业的临时性合作项目中&#xff0c;如何组建一个高效的跨部门项目团队是确保项目成功实施的关键。本篇幅将介绍如何组建一个成功的跨部门项目团队&#xff0c;包括明确项目目标与范围、确定项目组织模型、明确角色与职责、合理划分团队结构、制定沟通机制…

正则表达式[总结]

文章目录 1. 为什么要学习正则表达式2. 再提出几个问题&#xff1f;3. 解决之道-正则表达式4. 正则表达式基本介绍5. 正则表达式底层实现(重要)6. 正则表达式语法6.1 基本介绍6.2 元字符(Metacharacter)-转义号 \\\6.3 元字符-字符匹配符6.4 元字符-选择匹配符6.5 元字符-限定符…

html列表

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>列表名称</title> </head> <body> <!--有序列表--> <ol><li>java</li><li>python</li><li…

自然语言处理---文本预处理概述

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域。其主要应用于&#xff1a;语音助手、机器翻译、搜索引擎、智能问答等。 文本预处理概述 文本语料在输送给模型前一般需要一…

C++中->与.的区别

在类中 在 C 中&#xff0c;-> 和 . 都可以用于访问类的成员变量和成员函数。但它们在使用上有一些区别&#xff1a; 1. 对于指针类型的对象&#xff0c;必须使用 -> 来访问其成员&#xff1b;而对于非指针类型的对象&#xff0c;则需要使用 . 。 2. -> 运算符在实…

UE4/5 批量进行贴图Texture压缩、修改饱和度

该插件下载地址&#xff1a; &#x1f35e;正在为您运送作品详情https://mbd.pub/o/bread/ZZWYmpxw 适用于 UE4 4.25/4.26/4.27 UE5 以上版本 在Edit - Plugins中分别开启 插件 Python Editor Script Plugin 插件 Editor Scripting Utilites 如果会python代码&#xff0c;…