qt day 5

实现局域网的网络聊天室功能

 1>服务器代码

---------------------------------------------------------------
widget.h
---------------------------------------------------------------
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QTcpServer>
#include <QTcpSocket>
#include <QPushButton>
#include <QLabel>
#include <QListWidget>
#include <QLineEdit>
#include <QList>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void connectbtn_slot();void connected_slot();void readyread_slot();private:Ui::Widget *ui;//定义服务器QTcpServer *server;//定义一个链表存放连接的客户端数据QList<QTcpSocket *> client;};
#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);//连接按钮与对应槽函数connect(ui->connectbtn,&QPushButton::clicked,this,&Widget::connectbtn_slot);}Widget::~Widget()
{delete ui;
}//按下按钮后启动服务器
void Widget::connectbtn_slot()
{//读取端口号quint16 port = ui->portedit->text().toInt();//设置为监听状态if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return ;}QMessageBox::information(this,"成功","服务器启动成功");//连接客户端信号与槽函数connect(server,&QTcpServer::newConnection,this,&Widget::connected_slot);
}//客户端连接槽函数
void Widget::connected_slot()
{//获取客户端套接字QTcpSocket *cli = server->nextPendingConnection();//将得到的套接字写入链表client.push_back(cli);//把新套接字与接收信号连接connect(cli,&QTcpSocket::readyRead,this,&Widget::readyread_slot);}//有信息写入准备读取
void Widget::readyread_slot()
{//删除已经断开的客户端for(int i = 0;i < client.size();i++){if(client.at(i)->state() == 0){client.removeAt(i);}}//遍历发送数据的客户端for(int i = 0;i < client.size();i++){if(client.at(i)->bytesAvailable() != 0){//读取客户端数据QByteArray msg = client.at(i)->readAll();//将数据写到ui界面中ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据发送给所有客户端for(int j = 0;j < client.size();j++){client.at(j)->write(msg);}}}}

2>客户端代码

---------------------------------------------------------------
widget.h
---------------------------------------------------------------
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void connectbtn_slot();void connected_slot();void readyread_slot();void sndbtn_slot();void disconbtn_slot();void disconnect_slot();private:Ui::Widget *ui;//定义一个客户端套接字QTcpSocket *client;//定义一个用户名QString username;
};
#endif // WIDGET_H
---------------------------------------------------------------
widget.h
---------------------------------------------------------------
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//为客户端套接字实例化空间client = new QTcpSocket(this);//连接按钮与对应槽函数连接connect(ui->connectbtn,&QPushButton::clicked,this,&Widget::connectbtn_slot);//已连接信号与对应槽函数连接connect(client,&QTcpSocket::connected,this,&Widget::connected_slot);//服务器发送信息信号与对应槽函数连接connect(client,&QTcpSocket::readyRead,this,&Widget::readyread_slot);//发送按钮与对应槽函数连接connect(ui->sndbtn,&QPushButton::clicked,this,&Widget::sndbtn_slot);//断开按钮与对应槽函数connect(ui->disconbtn,&QPushButton::clicked,this,&Widget::disconbtn_slot);//断开连接信号与对应槽函数connect(client,&QTcpSocket::disconnected,this,&Widget::disconnect_slot);//设置按钮与编辑框可用ui->disconbtn->setEnabled(0);ui->sndbtn->setEnabled(0);ui->msgedit->setEnabled(0);}Widget::~Widget()
{delete ui;
}//连接按钮槽函数
void Widget::connectbtn_slot()
{//从ui界面读取IP与portQString IP = ui->IPedit->text();quint16 port = ui->portedit->text().toUInt();//连接服务器client->connectToHost(IP,port);
}//已连接槽函数
void Widget::connected_slot()
{//连接完成提示信息QMessageBox::information(this,"成功","成功进入聊天室");//发送xx进入聊天室提示给服务器username = ui->usernameedit->text();QString sndmsg = username + " : 进入聊天室";client->write(sndmsg.toLocal8Bit());//设置按钮与编辑框可用ui->usernameedit->setEnabled(0);ui->IPedit->setEnabled(0);ui->portedit->setEnabled(0);ui->connectbtn->setEnabled(0);ui->sndbtn->setEnabled(1);ui->msgedit->setEnabled(1);ui->disconbtn->setEnabled(1);}//读取服务器发送信息
void Widget::readyread_slot()
{//读取信息QByteArray msg = client->readAll();//将读取的信息发送到信息框内ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//发送按钮对应槽函数
void Widget::sndbtn_slot()
{//读取ui界面发送框内信息QString msg = ui->msgedit->text();msg = username + " : " + msg;//将数据发送给服务器client->write(msg.toLocal8Bit());
}//断开连接按钮对应槽函数
void Widget::disconbtn_slot()
{//准备发送离开信息QString msg = username + " : 离开聊天室";client->write(msg.toLocal8Bit());//断开连接client->disconnectFromHost();
}//断开连接信号槽函数
void Widget::disconnect_slot()
{QMessageBox::information(this,"断开连接","成功退出聊天室");//设置按钮与编辑框可用ui->usernameedit->setEnabled(1);ui->IPedit->setEnabled(1);ui->portedit->setEnabled(1);ui->connectbtn->setEnabled(1);ui->disconbtn->setEnabled(0);ui->sndbtn->setEnabled(0);ui->msgedit->setEnabled(0);
}

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

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

相关文章

golang入门笔记——nginx

文章目录 Nginx介绍Nginx的安装Nginx文件Nginx反向代理负载均衡nginx动静分离URLRewrite防盗链nginx高可用配置安全性Nginx限流Nginx缓存集成Lua脚本OpenRestry Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占用内存少&#xff0c;并发能力强&#x…

52、基于函数式方式开发 Spring WebFlux 应用

★ Spring WebFlux的两种开发方式 1. 采用类似于Spring MVC的注解的方式来开发。此时开发时感觉Spring MVC差异不大&#xff0c;但底层依然是反应式API。2. 使用函数式编程来开发★ 使用函数式方式开发Web Flux 使用函数式开发WebFlux时需要开发两个组件&#xff1a; ▲ Han…

一.使用qt creator 设计显示GUI

一.安装qt creator 二.创建项目 文件-》新建项目 三.使用设计 可以直接使用鼠标拖拽 四.转换为py文件 # from123.py 为导出 py文件的文件名 form.ui 为 qt creator创造的 ui 文件 pyuic5 -o x:\xxx\from123.py form.ui五.显示GUI from PyQt5.QtWidgets import * fr…

Android高通 8.1 老化apk打开摄像头花屏问题

1、最近由于公司VR 3D系统要做双Camera老化测试apk&#xff0c;同时老化4小时需要轮询切换二个摄像头&#xff0c;保证后面camera标定精度数据更准确。 2、一开始我尝试用之前方案移植过去然后同时打开双摄像头 突然发现花屏 如下图所示 3、于是一第一时间想到是不是分辨率不兼…

在UI设计中用什么样的字体?优漫动游

在windos下支持的字体 在UI设计中用什么样的字体&#xff1f; 宋体&#xff08;simsun&#xff09;&#xff1a;在win下大部分的浏览器是默认的&#xff0c;适合小字号&#xff0c;不太适合大字号。 微软雅黑&#xff1a;是目前win浏览器中最值得使用的。 Arial&#…

算法通关村——滑动窗口高频问题

1. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 1.1 滑动窗口 找到最长字串需要找到字串的首尾位置…

c++保留n位小数输出(百分数形式,保留n位有效数字,设置宽度)

在C中&#xff0c;你可以使用 头文件中的一些函数和控制符来控制输出的小数位数、百分数形式以及设置宽度。下面我将详细讲解如何实现这些功能。 控制小数位数 若要在输出中控制小数位数&#xff0c;你可以使用 std::setprecision 函数。这个函数接受一个整数参数&#xff0c…

多组背包恰好装满方案数

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 现在有一个大小n*1的收纳盒&#xff0c;我们手里有无数个大小为1*1和2*1的小方块&#xff0c;我们需要用这些方块填满收纳盒&#xff0c;请问我们有多少种不同的方法填满这个收纳盒 分析&…

关于 Unity 连接 MuMu 模拟器上的 Unity Remote 5 的方法

在使用 Unity 开发 Android 的过程中&#xff0c;可以通过使用 Unity Remote 这个 app 来和真机连接&#xff0c;进而在真实环境下进行测试性能等工作&#xff0c;而本次则是由于其他问题引出的一个小坑&#xff0c;记录以备后续查询。 这次是由于在自学过程中遇到的一个工程&…

MyBatisPlus枚举类最佳实践(非常典型和高效的枚举类写法)

目录 1、MyBatisPlus枚举类最佳实践 2、枚举类的作用及问题 3、MyBatisPlus注解实现枚举最佳实践 4、简单来说 5、下面我们看一个使用上述注解的完整枚举类示例: &#xff08;1&#xff09;枚举类&#xff1a; &#xff08;2&#xff09;DTO类&#xff1a; 6、根据上面…

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…

异步编程 - 13 高性能线程间消息传递库 Disruptor

文章目录 Disruptor概述Disruptor中的核心术语Disruptor 流程图 Disruptor的特性详解基于Disruptor实现异步编程 Disruptor概述 Disruptor是一个高性能的线程间消息传递库&#xff0c;它源于LMAX对并发性、性能和非阻塞算法的研究&#xff0c;如今构成了其Exchange基础架构的核…

探究IP路由的工作原理与路由表查找规则

文章目录 一、定义二、IP连通的前提三、路由表1. 作用2. 路由表字段内容3. 路由表查表规则4. 路由信息的来源5. 路由表写表规则6. 路由优先级 四、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 路由器是网络中负责将数据报文在不同IP网段…

git在linux情况下设置git 命令高亮

只需要执行下面这个命令&#xff0c;这样就可以在查看git status明亮的时候高亮显示。 git config --global color.status auto未设置前 谁知之后

linux中常见服务端安装

linux安装服务脚本 1、yum安装 # 通过apt安装yum apt install yum # yum安装软件 yum install pam-devel # yum 卸载 yum remove pam-devel2、rpm安装 # 安装 rpm -i example.rpm #安装 example.rpm 包&#xff1b; rpm -iv example.rpm #安装 example.rpm 包并在安装过程…

【Unity3D赛车游戏优化篇】【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Redis功能实战篇之附近商户

在互联网的app当中&#xff0c;特别是像美团&#xff0c;饿了么等app。经常会看到附件美食或者商家&#xff0c; 当我们点击美食之后&#xff0c;会出现一系列的商家&#xff0c;商家中可以按照多种排序方式&#xff0c;我们此时关注的是距离&#xff0c;这个地方就需要使用到我…

高等数学笔记

|sinx|连续不可导 只要在x0处存在极限且极限等于f(x0)则函数在此处连续 如果某点可导则左右导数应该相等&#xff08;可导一定连续&#xff0c;连续不一定可导&#xff09; 双曲函数的由来 塞入dx 莱布尼茨公式 sin(nx)的k次导n^k*sin(nxkΠ/2) 注意符号&#xff01; 二阶导公…

Golang源码分析

Golang源码分析 Golang源码分析-builtin.goGolang源码分析-bytes.goGolang源码分析-bytes/buffer.goGolang源码分析-bytes/reader.goGolang源码分析-strings.goGolang源码分析-strings builder.goGolang源码分析-strconv包Golang源码分析-io.goGolang源码分析-io/pipe.goGolan…

树的基本概念和存储结构

一、树的基本概念 1、树的定义 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1、有且仅有一个特定的称为根的结点。 2、当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09…