qt 聊天室

news/2025/3/4 4:14:51/

服务器端

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.ppmy.cn/news/828866.html

相关文章

C++学习第二十二天(deque容器及案例)

deque容器的基本概念 功能&#xff1a;双端数组&#xff0c;可以对头端进行删除和插入 deque和vector的区别 vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低 deque相对而言&#xff0c;对头部的插入和删除比较块 vector访问元素的速度比deque快&am…

fastapi docs打开为空白解决办法

空白的原因 使用的cdn为国外cdn 解决办法 使用国内cdn 解决步骤 1.打开此文件D:\Program Files\Python\Lib\site-packages\fastapi\openapi\docs.py 2.修改cdn地址 国内cdn不好找呀 &#xff08;1&#xff09;.七牛云存储 开放静态文件CDN&#xff0c;地址&#xff1a;h…

龙测AI模型中心成功上线,六大AI+测试模型提高100%工作效率

随着人工智能技术的不断发展和应用&#xff0c;各种复杂的数据和信息已经成为了我们日常工作中不可或缺的一部分。然而&#xff0c;如何有效地处理和分析这些数据和信息&#xff0c;成为了我们面临的一个巨大挑战。为了更好地应对这一挑战&#xff0c;我们决定成立龙测AI模型中…

CAD看图软件的快速搜索功能怎么用?

在CAD制图工作中&#xff0c;可能会需要查看大量的CAD图纸&#xff0c;但是有时候电脑里的CAD图纸太多而且存储位置不好找&#xff0c;若是查找需要的CAD图纸查看可能会很麻烦。这时候就要使用迅 J CAD看图软件来快 速搜索CAD图纸打开查看了。可是CAD看图软件的快 速搜索功能怎…

IrfanView 看图软件下载及汉化

IrfanView 64位下载地址 上图红框地址为&#xff1a; https://www.fosshub.com/IrfanView.html?dwliview454_x64_setup.exe 下载后正常安装即可&#xff0c;效果如下图&#xff1a; 问题在于英文阅读比较麻烦&#xff0c;需要额外下载中文汉化包 中文汉化包网址 红框下载地…

武无第二的acd看图软件下载

摘要&#xff1a;acd看图软件下载 2012年06月12日&#xff0c;互动交流的机会&#xff0c;有的人实现了梦想&#xff0c;叫做五行密境那个任务貌似要进宗族&#xff0c;神话acd看图软件下载特别策划整个网站高校巡演&#xff0c;领取后还有机会赢取万元奖学金和数码大奖&#x…

在线HTTP速度测试(响应时间测试)及浏览器兼容测试

一.前言 网站的响应时间&#xff0c;是判断一个网站是否是好网站的重要的因素之一。百度首页的响应时间在全国各个省份小于10ms。这个响应时间远远好于竞争对手。根据美丽说的技术负责人分析&#xff0c;美丽说访问速度提升10%&#xff0c;用户量提升30%。所以网站的响应速度非…

网页打开速度测试

使用步骤 1.打开 需求网页F12打开DevTools&#xff1a; 开始输入&#xff1a; 保存&#xff1a; 2.数据 每一条测试五次&#xff0c;Regular 3G无标准略过即可&#xff0c;GOOD 3G要求标准为平均值1秒内&#xff0c;Regular 4G要求标准为平均值1秒内&#xff0c;WIFI要求标准…