Qt DAY5 Qt制作简易网络聊天室

news2024/11/27 16:26:38

服务器

widget.h文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QVector>//向量,函数类模板
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_openBtn_clicked();

    void newconnection_slot();
    void readyRead_slot();

private:
    Ui::Widget *ui;
    QTcpServer *server;
    QVector<QTcpSocket *> clientVector;//客户端容器
};

#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);

    server = new QTcpServer(this);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openBtn_clicked()
{
    quint16 port=ui->portEdit->text().toUInt();

    if(server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"成功","打开服务器成功");
    }
    else
    {
        QMessageBox::information(this,"失败","打开服务器失败");
        return;
    }

    connect(server,&QTcpServer::newConnection,this,&Widget::newconnection_slot);
}

void Widget::newconnection_slot()
{
    QTcpSocket *s = server->nextPendingConnection();
    clientVector.push_back(s);
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

void Widget::readyRead_slot()
{
    //删除无效的客户端
    for (int i=0;i<clientVector.size();i++)
    {
        if(clientVector[i]->state()==0)
        {
            clientVector.removeAt(i);
        }
    }
    //
    for (int i=0;i<clientVector.size();i++)
    {
        if(clientVector[i]->bytesAvailable()!=0)
        {
            QByteArray msg= clientVector[i]->readAll();
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));

            for(int j=0;j<clientVector.size();j++)
            {
                clientVector[j]->write(msg);
            }
        }
    }

}

客户端

widget.h文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket> //客户端类
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connnectBtn_clicked();
    void connected_slot();
    void readyRead_slot();
    void disconnected_slot();

    void on_sendBtn_clicked();

private:
    Ui::Widget *ui;

    QTcpSocket *socket;
    QString userName;
};

#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);
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}


Widget::~Widget()
{
    delete ui;
}

void Widget::on_connnectBtn_clicked()
{

    QString ip=ui->ipEdit->text();
    quint16 port=ui->portEdit->text().toUInt();
    userName=ui->userEdit->text();

    if(ui->connnectBtn->text()=="连接服务器")
    {
        socket->connectToHost(ip,port);

        ui->connnectBtn->setText("服务器断开");
    }
    else
    {

        QString msg=userName+":离开聊天室";
        socket->write(msg.toLocal8Bit());

        socket->disconnectFromHost();

        ui->connnectBtn->setText("连接服务器");

    }
}

void Widget::connected_slot()
{
    QMessageBox::information(this,"成功","连接服务器成功");
    QString msg=userName+":进入聊天室";
    socket->write(msg.toLocal8Bit());
}

void Widget::readyRead_slot()
{
    if(socket->bytesAvailable()!=0)
    {
        QString msg=QString::fromLocal8Bit(socket->readAll());
        ui->msgWidget->addItem(msg);
    }

}

void Widget::disconnected_slot()
{
    QMessageBox::information(this,"信息","服务器已断开");
}

void Widget::on_sendBtn_clicked()
{

    QString msg=userName+":"+ui->msgEdit->text();
    socket->write(msg.toLocal8Bit());
    QMessageBox::information(this,"成功","信息发送成功");
}

 

 

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

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

相关文章

STM32+FreeRTOS 使用SystemView监控系统

前言 本文以STM32F407ZET6 FreeRTOS V9.0作为演示&#xff0c;其它的Cortex M芯片同样可以参考此文&#xff0c;其他内核和RTOS理论上也支持&#xff0c;本文暂时不做研究。 所以开始阅读本文前&#xff0c;需要一块能运行FreeRTOS的Cortex M芯片&#xff0c;如果没有移植好…

发一下接口自动化测试框架(python3+requests+excel)

Git&#xff1a; https://github.com/lilinyu861/Interface-Test 环境配置&#xff1a; 开发工具&#xff1a;pycharm2018Excel 开发框架&#xff1a;python3requestsexcel 接口自动化测试框架介绍&#xff1a; 此接口测试框架&#xff0c;首先由用户设计原始的测试用例并为…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件&#xff1a;clean-webpack-plugin合并配置文件插件&#xff1a;webpack-merge实时更新和预览效果&#xff1a;webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习&#xff0c;完成了webpack的基本配置&#xff0c…

C++教程——const修饰指针、结构体、文件操作

const修饰指针 常量指针 指针常量 const既修饰指针&#xff0c;又修饰常量 指针与数组 结构体 通过指针访问结构体变量中的数据 结构体中const使用场景 文件操作 写文件 读文件 读取数据的方式 二进制读写文件 写文件 读文件

master、origin master和origin/master

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

线程任务分支合并框架

1、原理 2、实用类 &#xff08;1&#xff09; ForkJoinPool 分支合并池 类比> 线程池 &#xff08;2&#xff09; ForkJoinTask ForkJoinTask 类比> FutureTask &#xff08;3&#xff09; RecursiveTask 递归任务&#xff1a;继承后可以实现递归(自己调自己)调用…

从小白到大神之路之学习运维第57天--------shell脚本实例应用3.0--以及————结合“三贱客”之“grep”的相关用法

第三阶段基础 时 间&#xff1a;2023年7月11日 参加人&#xff1a;全班人员 内 容&#xff1a; shell实例 目录 一、循环的基本使用 while随机循环 二、case控制服务的基本应用 1、case的语法格式 2、使用case写脚本&#xff0c;以以下实验为主 例1&#xff1a;控…

vue + Luckysheet 实现在线Excel表格操作

需求千千万&#xff0c;又是难熬的一天&#xff01; 效果图&#xff1a; Luckysheet官网网站&#xff1a;快速上手 | Luckysheet文档 1、引入&#xff08;两种&#xff09; 第一种CDN引入 在项目中的 public ---> index.html 中添加代码&#xff0c;如下&#xff1a; &…

91.qt qml-圆角毛玻璃 高斯模糊

qml中使用毛玻璃,可以通过两个类型GaussianBlur或者FastBlur使用,效果如下所示: 接下来先来介绍FastBlur和GaussianBlur 1.FastBlur介绍 FastBlur提供比GaussianBlur更低的模糊质量,但渲染速度更快。FastBlur效果通过使用源内容缩小和双线性滤波的算法模糊源内容来软化源内…

【免费送书活动第一期】赠送实体图书《深入浅出Java虚拟机》JVM原理与实战

赠送实体图书四本&#xff08;免费赠送&#xff09; 《深入浅出JAVA虚拟机&#xff1a;JVM原理与实战》 内容简介&#xff1a; 本书主要以 Java 虚拟机的基本特性及运行原理为中心&#xff0c;深入浅出地分析 JVM 的组成结构和底层实现&#xff0c;介绍了很多性能调优的方案和…

idea编译时遇到的bug

1、 D:\workspace\spark\src\main\Scala\WordCount.scala:3:8 WordCount is already defined as object WordCount object WordCount { 解决参考博客&#xff1a;Error:(21, 8) FlumePushWordCount is already defined as object FlumePushWordCount object FlumePushWor_WSQ(…

Switch超频图文说明

Switch超频图文说明 有些游戏&#xff0c;官方锁频导致游戏卡顿&#xff0c;可以通过超频提升游戏体验。抽空研究了下&#xff0c;发现超频可以在大气层 Atmosphere 和 SX OS系统中使用。 正巧最近有同学询问&#xff0c;就整理个教程好了。 Switch超频图文说明 按自己的破解系…

14-Vue插槽(slot),制作可复用组件

什么是 slot ? Vue 将 <slot>元素作为承载分发内容的出口。插槽内可以包含任何模板代码&#xff0c;包括 HTML或其它组件。 在某些组件的模板中&#xff0c;有一部分区域需要父组件来指定 <!-- message组件&#xff1a;一个弹窗消息 --> <div class"mes…

【工具】浏览器自带下载加速功能

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

srt转rtmp(mpegts -> flv)

一、使用ffmpeg拉流srt转rtmp推流过程中遇到音视频问题 1、音频 虽然从mpegts到flv都是AAC格式&#xff0c;但是mpegts多了ADTS头&#xff0c;在flvenc的时候会报错误&#xff1a; Malformed AAC bitstream detected: use the audio bitstream filter aac_adtstoasc to fix it…

JAVA克隆

更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解JAVA中的clone 目录 什么是clone如何实现clone 浅克隆深克隆小结 什么时候使用cloneclone 相关类库的实现分析 什么是clone 在Java中&#xff0c;克隆&#xff08;Clone&#xff09;指的是创建一个现有对…

linux命令与shell编程

文章目录 一、概念linux内存嵌入式嵌入式层次图判断小端和大端 二、linux系统操作命令ls查看cd 命令pwd命令touch 创建文件mkdir 创建目录chmod 修改权限man命令cp 拷贝mv 移动rm命令cat命令echo 命令tty命令->查看当前终端号clear 命令ldd命令 ->查看文件依赖哪些库prin…

make makefile

文章目录 make是一个命令makefile or Makefile是一个当前目录下的文件使用&#xff1a;生成可执行文件清理 作用依赖关系依赖方法make会自动推导makefile中的依赖关系栈式结构为什么清理的时候要make 加上clean?make后面可以直接跟要生成的可执行文件,指定名称的依赖关系和依赖…

Python第二天之容器学习

1.List 容器无非就增删改查 1.添加 name_list [aaa,bbb,ccc,ddd] name_list.append(b1) name_list.insert(1,xxx) print(name_list)append 是在后面追加 而insert是自己定义下表插入 name_list [aaa,bbb,ccc,ddd] name_list2 [qqq,222,111] name_list.extend(name_list…

python 面向对象编程

文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 魔法方法__ init __() 方法__ str __()方法__ del __() 方法 前言 大家好&#xff0c;前面我们…