qt 聊天室

news2024/10/7 18:25:06

服务器端

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"));//设置图标
    //创建logo

    socket=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.coloradmin.cn/o/743693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK插件介绍

ELK插件介绍 一、Grok 正则捕获插件1、概述2、内置正则表达式调用3、自定义表达式调用 二、multiline 多行合并插件1、概念2、安装3、使用 multiline 插件 三、date 时间处理插件1、概念2、操作3、时间戳详解 四、mutate 数据修改插件1、概念2、案例 一、Grok 正则捕获插件 1、…

上海亚商投顾:沪指震荡反弹 新能源车产业链再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡反弹&#xff0c;创业板指午后涨近1%。新能源车产业链再度爆发&#xff0c;整车、零部件、智能驾驶等…

python接口自动化(二十九)--html测试报告通过邮件发出去——上(详解)

简介 前边几篇&#xff0c;已经教小伙伴们掌握了如何生成HTML的测试报告&#xff0c;那么生成测试报告&#xff0c;我们也不能放在那里不管了&#xff0c;这样即使你报告在漂亮&#xff0c;领导也看不到。因此如果想向领导汇报工作&#xff0c;不仅需要提供更直观的测试报告。而…

大学生活动社交小程序开发笔记(1)

可研分析 大学生活动社交小程序是一种基于移动互联网的社交平台&#xff0c;旨在为大学生提供一个方便、快捷、安全的社交和活动交流平台 功能规划 活动发布&#xff1a;平台可以发布将要举行的活动&#xff0c;包括时间、地点、费用等信息&#xff0c;并邀请其他用户参加。…

《UNUX环境高级编程》(8)进程控制

1、引言 2、进程标识 每个进程都用一个唯一的非负整数标识&#xff0c;即为进程id&#xff1a;pid。进程ID是可以复用的&#xff0c;当一个进程终止时&#xff0c;其进程ID就可以用来标识其他进程。系统中有一些专用进程&#xff1a; 进程ID为0的是调度进程&#xff0c;也称交…

【软件测试】Git 远程仓库的使用(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 查看远程仓库 想…

Docker笔记 容器的数据卷

1. 数据卷概念 思考&#xff1a; Docker容器删除后&#xff0c;在容器中产生的数据还在吗&#xff1f; 答案是不在了&#xff0c;数据存放在容器中&#xff0c;如果将容器删除&#xff0c;数据也会被一并删除 Docker容器和外部机器可以直接交换文件吗&#xff1f; 答案是不…

为什么需要Promises ?

同步"异步操作", 避免Block多层嵌套造成的"回调地狱" The problem with async code (without Promises) Typically, async operations take a completion handler in a form of a block, which is called to provide either a result or an error. To per…

银河麒麟服务器v10 sp1 部署 redis 及redis gui 客户端工具

上一篇&#xff1a;银河麒麟服务器v10 sp1 redis开机自动启动_csdn_aspnet的博客-CSDN博客 本文介绍另一种redis安装方式及客户端工具安装。 Redis 是一种内存数据模型存储&#xff0c;可用作数据库、缓冲区和消息传递中继。它是开源的&#xff08;BSD 许可&#xff09;。字符…

热爱python的第一天:初识python,搭建python环境,运行第一个python小程序

目录 1 初始python python 概述 python的应用领域 应用python的公司 2 搭建python 开发环境 2.1 安装python&#xff08;以windows 系统为例&#xff09;&#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09; 下载保存后打开文件夹点击以管理员身份运行 &…

IntegrityError: FOREIGN KEY constraint failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

nginx漏洞修复之检测到目标URL存在http host头攻击漏洞

漏洞说明 为了方便的获得网站域名&#xff0c;开发人员一般依赖于HTTP Host header。例如&#xff0c;在php里用_SERVER[“HTTP_HOST”]。但是这个header是不可信赖的&#xff0c;如果应用程序没有对host header值进行处理&#xff0c;就有可能造成恶意代码的传入。 解决方法…

安全狗亮相2023第二届上海网络安全博览会

7月5日至7日&#xff0c;“新耀东方-2023第二届上海网络安全博览会暨高峰论坛”在上海顺利举办。此次大会由上海市信息网络安全管理协会、国家计算机网络应急技术处理协调中心上海分中心、(ISC)2上海分会、上海市普陀区科学技术委员会、上海市网络安全产业示范园共同主办。 作…

Keil5开发STM32F4

Gitee keil工程 软件下载和安装&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PWDAU0EhVZ6J8h6xH_uw5g 提取码&#xff1a;b343 MDK526.exe Keil.STM32F4xx_DFP.2.17.1.pack keygen_2032.exe JLink_Windows_V640.exe en.stsw-stm32065_v1-7-1_STM32F4 &…

【数据仓库】Windows源码安装DataEase,DataEase二次开发

上文记录了DataEase入门使用指南&#xff0c;本文主要记录Windows下源码安装及二次开发步骤【数据仓库】BI看板DataEase入坑指南_wenchun001的博客-CSDN博客 改动文件 源码 GitHub release 链接: Releases dataease/dataease GitHub SDK 软件环境 后端&#xff1a; JDK …

MongoDB快速入门

虽说现在关系型数据库还是主流&#xff0c;但是面对某些需求的时候&#xff0c;需要非关系型数据库来补充它&#xff0c;学习一个主流的NoSQL数据库还是很有必要的。MongoDB是一个功能丰富的NoSQL数据库&#xff0c;本文整理了它最常用的部分形成了这篇入门教程&#xff0c;希望…

设计模式——命令模式

命令模式 定义 将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求吧客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 命令模式是一个高内聚的模式。 优缺点、应用场景 优点 类间解耦。调用者与接收者之间没有任…

探索AI领域,AI图像安全技术助力行业健康发展

目录 一、AI时代降临二、AIOCR与传统OCR技术三、通过人工智能模型生成AI图片技术探索四、提前布局&#xff0c;合合信息AI图像安全技术助力行业健康发展1、识别医疗门诊发票和报告2、图像篡改检测升级&#xff0c;截图篡改检测3、AIGC判别&#xff0c;人脸伪造检测4、OCR对抗攻…

WebSocket使用记录

使用视频地址 1、添加前端使用文件 2、后端配置 2.1添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.2添加websocket配置类 import org.spri…

NETSDK1141 无法解析位于 global.json 中指定的 .NET SDK 版本

1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本 3.直接找到项目中的 global.json 文件&#xff0c;右键打开&#xff0c;直接修改版本为本机的SDK版本&#xff0c;就可以用了 微软文档也有详细说明: ​​​​​​NETSDK1141&#xff1a;无法解析 global.json 中指定的…