qt 聊天室

服务器端

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//实例化一个服务器对象server =new QTcpServer(this);}Widget::~Widget()
{delete ui;
}//打开服务器按钮对应的槽函数
void Widget::on_tcpbtn_clicked()
{//获取ui界面上的端口号quint16 port = ui->pe->text().toUInt();//将服务器设置成监听状态//函数原型:bool listen()//将服务器设置为监听状态//参数1:要监听的主机地址,如果是any,则表明监听任意主机地址//参数2:接入的端口号,如果为0,表明,端口号由系统自动分配if(server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"成功","打开服务器成功");//此时表明服务器已经打开,并处于监听状态//如果有客户端发来连接请求,那么该服务器就会自动触发一个newconnection信号}connect(server,&QTcpServer::newConnection,this,&Widget::newconnection_slot);
}void Widget::newconnection_slot()
{//获取最新连接的客户端套接字QTcpSocket *s =server->nextPendingConnection();//将该套接字放入到套接字文件中clientVector.push_back(s);//此时一个服务器和多个客户端已经建立连接,如果有客户端向服务器发来数据//那么该客户端就会自动发射一个readyRead的信号//我们可以将该信号连接到自定的槽函数中,处理相关逻辑connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//处理readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//删除无效的客户端for(int i=0;i<clientVector.size();i++){//clientVector[i]:表示的是任意一个客户端if(clientVector[i]->state()==0){//删除clientVector.removeAt(i); //将当前客户端移除该容器}}//判断是哪一个客户端发来的数据for(int i=0;i<clientVector.size();i++){//判断当前的套接字中是否有数据待读//函数原型 bytesAvailable//功能:返回当前客户端的能被读取的字节个数//参数:无//返回值:可被读取的字节个数if(clientVector[i]->bytesAvailable()!=0){QByteArray msg= clientVector[i]->readAll();//将读取的数据 放到ui界面上ui->lw->addItem(QString::fromLocal8Bit(msg));//将获取的该套接字中的数据广播给所有客户端for(int j=0;j<clientVector.size();j++){clientVector[j]->write(msg);}}}

客户端:

widget.cpp

#include "second.h"
#include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second)
{ui->setupUi(this);this->setWindowTitle("聊天室界面");//设置标题this->setWindowIcon(QIcon("C:\\Users\\86150\\Desktop\\icon\\1\\denglu_1.png"));//设置图标//创建logosocket=new QTcpSocket(this);//连接服务器connect(socket,&QTcpSocket::connected,this,&second::connected_slot);connect(socket,&QTcpSocket::readyRead,this,&second::readyRead_slot);}
void second::jump_slot()
{this->show();
}
second::~second()
{delete ui;
}void second::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.drawPixmap(rect(),QPixmap("C:\\Users\\86150\\Desktop\\icon\\background"));
}void second::on_pushButton_clicked()
{bool ok;QFont f=QFontDialog::getFont(&ok,QFont("宋体",10,2,false),this);if(ok){ui->textEdit->setCurrentFont(f);}else {QMessageBox::information(this,"错误","没有识别到你要的字体");}
}void second::on_pushButton_2_clicked()
{QColor c=QColorDialog::getColor(Qt::black,this,"字体颜色");if(c.isValid()){ui->textEdit->setTextColor(c);}else {QMessageBox::information(this,"错误","设置颜色失败");}
}void second::on_pushButton_3_clicked()
{QString path=QFileDialog::getOpenFileName(this,"打开文件","./","所有文件(*.*);;文本文件(*.txt);;");QFile file(path);if(!file.exists()){QMessageBox::information(this,"错误信息","不存在");return;}if(!file.open(QIODevice::ReadWrite)){QMessageBox::information(this,"错误信息","读写错误");return;}QByteArray msg=file.readAll();file.close();ui->textEdit->setText(QString::fromLocal8Bit(msg));}void second::on_pushButton_4_clicked()
{QString path=QFileDialog::getSaveFileName(this,"保存文件","./","所有文件(*.*);;文本文件(*.txt);;");QFile file(path);if(!file.open(QIODevice::ReadWrite)){QMessageBox::information(this,"错误信息","不存在");return;}QString msg=ui->textEdit->toPlainText();file.write(msg.toLocal8Bit());file.close();
}void second::on_pushButton_5_clicked()//发送按钮对应的槽函数
{QString msg =userName+" :"+ui->textEdit->toPlainText();socket->write(msg.toLocal8Bit());ui->textEdit->clear();
}void second::on_connectbtn_clicked()
{QString ip =ui->ipedit->text();quint16 port=ui->portedit->text().toUInt();userName=ui->nameedit->text();if(ui->connectbtn->text()=="连接服务器"){socket->connectToHost(ip,port);ui->connectbtn->setText("断开服务器");}else{QString msg = userName + ":离开聊天室";socket->write(msg.toLocal8Bit());//完成断开服务器的逻辑socket->disconnectFromHost();ui->ipedit->setEnabled(true);ui->portedit->setEnabled(true);ui->nameedit->setEnabled(true);ui->connectbtn->setText("连接服务器");}
}void second::connected_slot()
{QString msg=userName+":进入聊天室";socket->write(msg.toLocal8Bit());QMessageBox::information(this,"","连接成功");ui->ipedit->setEnabled(false);ui->portedit->setEnabled(false);ui->nameedit->setEnabled(false);
}void second::readyRead_slot()
{if(socket->bytesAvailable()!=0){QString msg=QString::fromLocal8Bit(socket->readAll());ui->listWidget->addItem(msg);}
}

 

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

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

相关文章

nginx添加模块fastdfs-nginx-module(docker版,不需要重写dockerfile)

nginx添加模块fastdfs-nginx-module&#xff08;docker版&#xff0c;不需要重写dockerfile&#xff09; 一、fastdfs-nginx-module模块准备1.1、下载模块1.2、配置模块参数 二、重新制作nginx的二进制执行文件2.1、查看nginx版本2.2、下载nginx配套版本的源码文件2.3、制作ngi…

安装RabbitMQ 详细步骤

我这里是在Linux系统里面安装的按照步骤即可 1. 安装Socat&#x1f349; 在线安装依赖环境&#xff1a; yum install gcc yum install socat yum install openssl yum install openssl-devel2. 安装Erlang&#x1f349; 去官网下载一下安装包&#xff0c;将安装包拉到Linux系…

Visual Studio Code 编辑器实用插件简介

Visual Studio Code 编辑器插件 以下是一些常用的 Visual Studio Code 编辑器插件及其简短描述&#xff1a; 2gua.rainbow-brackets&#xff1a;在括号周围添加彩虹色的边框&#xff0c;以帮助区分不同层次的括号。adpyke.codesnap&#xff1a;将代码片段转换为漂亮的图片&am…

Vue插槽

默认插槽 src/App.vue <template><div class"container"><Category title"美食"><img src"https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt""></Category><Category title"游戏">&l…

得物自建 DTS 平台的技术演进 | 精选

0 前言 DTS是数据传输平台(Data Transfer Platform的缩写) 随着得物App的用户流量增长&#xff0c;业务选择的数据库越来越多样化&#xff0c;异构数据源之间的数据同步需求也逐渐增多。为了控制成本并更好地支持业务发展&#xff0c;我们决定自建DTS平台。本文主要从技术选型、…

两组表单看懂MySQL的多表查询

第一组表单信息 1、查询每个部门的所属员工 mysql> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 d-> LEFT JOIN emp3 e-> ON d.deptno e.dept_id-> GROUP BY d.deptno-> UNION -> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 …

分层解耦-IOCDI引入

目录 分层解耦 如何解除耦合 控制反转&#xff08;IOC&#xff09; 依赖注入&#xff08;DI&#xff09; Bean对象 分层解耦 内聚&#xff1a;软件中各个功能模块内部的功能联系耦合&#xff1a;衡量软件中各个层/模块之间的依赖、关联程度软件设计原则&#xff1a;高内聚…

开源Cillium项目为容器提供强大的网络功能

试验性的开源Cillium项目使用Linux内核的一项现有特性&#xff0c;为容器提供高速、强大的网络功能。一项名为Cilium的开源项目试图基于Linux内核中所用的技术&#xff0c;为容器提供一种新的网络方法。 试验性的开源Cillium项目使用Linux内核的一项现有特性&#xff0c;为容器…

HP Laser 136nw打印机与win10实现Wifi直连

HP Laser 136nw打印机与win10实现Wifi直连 HP Laser 136nw打印机设置HP Smart HP Laser 136nw打印机设置 打开打印机WIFI开关&#xff0c;使其他设备可以搜索到 查看打印机设备名称&#xff0c;用于设备搜索 查看打印机WIFI密钥&#xff0c;用于windows与打印机直连 根据…

手写JAVA线程池

前言 手写一个简单的java线程池&#xff1a;重点关注&#xff0c;如何确保一直有运行的线程&#xff1f;如何确保线程消费提交的任务信息&#xff1f;。一直保存有运行的线程底层使用的是死循环。使用消息队列确保信息的提交和消费。消息队列使用先进先出原则。 步骤 线程池…

iOS开发 - 系统自带框架实现扫一扫功能

iOS 扫一扫 利用系统自带框架实现扫一扫功能 一 项目配置 扫一扫功能相机和相册权限&#xff0c;在info.plist中设置询问用户是否允许访问的权限。 info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription <key&g…

spring 详解二 IOC(Bean xml配置及DI)

配置列表 Xml配置 功能描述 <bean id"" class""></bean> Bean的id&#xff0c;配置id会转为Bean名称和不配就是全限定类名 <bean name"" ></bean> Bean的别名配置&#xff0c;存储在Factory的aliasMap中通过别名也…