QT(9.4)tcp通信,数据库,opencv,

作业:

1.服务器

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>//客户端头文件
#include <QMessageBox>//消息对话框头文件
#include <QTcpServer>//服务器头文件
#include <list> //链表头文件,用来存放客户端容器QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void newConnection_slot();//自定义处理newconnection信号的槽函数void readyRead_slot();//自定义处理readyRead信号的槽函数void on_startbtn_clicked();private:Ui::Widget *ui;//定义服务器指针QTcpServer *server;//定义客户端指针链表容器QList<QTcpSocket *> clientList;
};
#endif // WIDGET_H

自定义函数:

#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_startbtn_clicked()
{//获取ui界面上的端口号,用无符号的16为整型quint16 port = ui->portEdit->text().toUInt();//将服务器设置成监听状态if(!server->listen(QHostAddress::Any,port)){//启动失败消息提示框QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}//此时服务器已经启动成功,将服务器设置成监听状态//当有客户端发来连接请求时,服务器就会发射一个newConnection信号//将该信号连接到对应的槽函数中处理相关逻辑connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}
//处理newConnected信号的槽函数
void Widget::newConnection_slot()
{//获取最新连接的客户端的套接字QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientList.push_back(s);//如果该套接字有数据向服务器发送,那么套接字就会发射一个readyRead信号//我们可以将该信号连接到自定义的槽函数中connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}
//对readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//遍历客户端容器中的所有客户端删除断开连接的客户端for(int i=0;i<clientList.count();i++){if(clientList[i]->state()==0){clientList.removeAt(i);//移除下标为i的客户端}}//遍历所有客户端,查看那个客户端发来数据for(int i=0;i<clientList.count();i++){//判断如果第i个客户端有待读取的数据if(clientList[i]->bytesAvailable()!=0){//读取相关数据QByteArray msg = clientList[i]->readAll();//展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));//将接收到的消息发送给所有客户端for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}
}

客户端:

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket> //客户端头文件
#include <QMessageBox>//消息对话框类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void connected_slot();//自定义处理connected信号的槽函数void readyRead_slot();//自定义处理readyRead信号的槽函数void on_sendBtn_clicked();void on_disConnectBtn_clicked();void disconnected_slot();//自定义处理disconnected信号的槽函数private:Ui::Widget *ui;//定义一个客户端指针QTcpSocket *socket;QString userName; //用户名
};
#endif // WIDGET_H

自定义函数:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给客户端指针实例化空间socket = new QTcpSocket(this);//如果连接服务器成功,该客户端就会发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次,所以,写在构造函数中即可connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端与服务器连接成功后,如果服务器客户端发来数据,那么客户端就会//我们可以将该信号连接到自定义的槽函数中处理相关逻辑connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号//我们可以将该与自定义槽函数连接//由于只需要连接一次,所以将该连接写到构造函数中connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面的信息userName = ui->userNameEdit->text();//获取用户名QString hostName = ui->ipEdit->text(); // 获取主机地址quint16 port = ui->portEdit->text().toUInt();//获取端口号//调用函数连接到主机//函数原型:virtual void connectToHost(const QString &hostName, quint16 port)//参数1:服务器的主机地址//参数2:端口号//返回值:无socket->connectToHost(hostName,port);//如果连接服务器成功,该客户端就会发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次,所以,写在构造函数中即可}
//关于处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this,"成功","连接服务器成功");//向服务器发送一条消息,说:***:进入聊天室QString msg = userName + ":进入聊天室";socket->write(msg.toLocal8Bit());
}
//关于readyRead信号对应的槽函数的实现
void Widget::readyRead_slot()
{//读取该客户端中的数据QByteArray msg = socket->readAll();//将数据展示在ui界面ui->msgList->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//获取Ui界面中的编辑的文本内容QString m = ui->msgEdit->text();//整合要发送的信息QString msg = userName + ":" + m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->msgEdit->clear();
}
//断开按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//准备要发送的信息QString msg = userName + ":离开聊天室";socket->write(msg.toLocal8Bit());//调用成员函数disconnectFromHost//函数原型://功能:断开客户端与服务器的链接//参数:无//返回值:无socket->disconnectFromHost();//当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号//我们可以将该与自定义槽函数连接//由于只需要连接一次,所以将该连接写到构造函数中
}
//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","断开成功");
}

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

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

相关文章

Linux修复损坏的文件系统

如何判断文件系统是否损坏 当文件系统受损时&#xff0c;将会出现一些明显的迹象。例如&#xff0c;文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外&#xff0c;系统也可能发出一些错误信息&#xff0c;如"Input/output error"、"Filesyst…

Acwing算法心得——现代艺术(统计遍历)

大家好&#xff0c;我是晴天学长&#xff0c;先用两个一维数组维护数据&#xff0c;再统计遍历二维数组&#xff0c;需要的小伙伴请自取哦&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;现代艺术 2) .算法思路 现代艺术 1.两个数组维护行和列 2.遍历数组…

Spring框架简介

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

简明SQL条件查询指南:掌握WHERE实现数据筛选

条件查询是用于从数据库中根据特定条件筛选数据行的一种方式&#xff0c;它避免了检索整个表中的数据。通常&#xff0c;使用 WHERE 子句来定义过滤条件&#xff0c;只有符合这些条件的数据行才会被返回。 SQL中的运算符有&#xff1a;、!、<、> 等&#xff0c;用于进行…

「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏

本文主要介绍在多个页面存在相同部分时&#xff0c;如何提取公共组件然后在多个页面中导入组件重复使用来减少重复代码。在这基础上介绍了通过嵌套路由的方式来避免页面较多或公共部分较多的情况下&#xff0c;避免不断手动导入公共组件的麻烦&#xff0c;并且加快页面跳转的速…

KT142C-sop16语音芯片ic的串口指令详细说明_默认9600指令可设

3.1 通讯格式 支持异步串口通讯模式,通过串口接受上位机发送的命令 通讯标准:9600 bps --- 可以发送指令修改&#xff0c;并且记忆&#xff0c;详见3.4.5 数据位 :8 停止位 :1 校验位 :none 流控制 :none 格式&#xff1a;$S VER Len CMD Feedback para1 …

PIGOSS BSM:网络大屏展现功能与特色全面解析

导语 PIGOSS BSM是一款强大的IT运维监控工具&#xff0c;提供了丰富的功能和特色。其中的“网络大屏”模块是其核心功能之一&#xff0c;能够以直观、全面的方式展示网络设备的状态信息和各种关键指标。本文将详细介绍PIGOSS BSM网络大屏的功能及特色&#xff0c;让您全面了解其…

多线程与高并发——并发编程(6)

文章目录 六、并发集合1 ConcurrentHashMap1.1 存储结构1.2 存储操作1.2.1 put方法1.2.2 putVal方法-散列算法1.2.3 putVal方法-添加数据到数组&初始化数组1.2.4 putVal方法-添加数据到链表1.3 扩容操作1.3.1 treeifyBin方法触发扩容1.3.2 tryPresize方法-针对putAll的初始…

React16、18 使用 Redux

Redux 核心 Redux 介绍 Redux 是javaScript 状态容器&#xff0c;提供可预测化的状态管理 Redux 工作流程 Actions&#xff1a;对象&#xff0c;描述对状态进行怎样的操作 Reducer&#xff1a;函数&#xff0c;操作状态并返回新的状态 Store&#xff1a;存储状态的容器&am…

Unity Asset Bundle Browser 工具

Unity Asset Bundle Browser 工具 您可以在 Unity 项目中使用 Asset Bundle Browser 工具能够查看和编辑资源包的配置。 有关更多信息&#xff0c;请参阅 Unity Asset Bundle Browser 文档。 注意&#xff1a;此工具是不受支持的实用程序。查看极大的资源包可能会导致性能下…

关于µC/OS-III 多任务的基本理解

关于C/OS-III 多任务的基本理解 任务和任务管理是 RTOS 的核心&#xff0c;且大多数项目使用 RTOS 的目的就是为了使用 RTOS 的多任务管理能力。 C/OS-III作为经典的RTOS&#xff0c;了解并学习其任务管理机制&#xff0c;是非常有必要的。 文章目录 关于C/OS-III 多任务的基本…

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…

Excel VSTO开发5 -Excel对象结构

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 5 Excel对象结构 Excel提供了几个比较重要的对象&#xff1a; Application、Workbooks、Workbook、Worksheets、Worksheet 为了便…

Ubantu终端常用命令、快捷键和基本操作

目录 前言 一、常用命令 二、常用快捷键 三、快捷键自定义设置 总结 前言 Ubantu终端常用命令和快捷键用于进行系统管理、文件操作、软件安装等常见使用场景。使用它们可以提高工作效率&#xff0c;简化操作流程&#xff0c;并进行更多的自定义配置和控制。同时&#xff0c…

jenkins创建用户

一.背景 之前用了很多次&#xff0c;现在转到甲方爸爸的岗位&#xff0c;要培养大学毕业生&#xff0c;才发现好记性不如烂笔头。给年轻人写出来。 二.创建用户的过程 1.用户管理界面入口 Dashboard>Manage Jenkins>Jenkins own user database 2.点击右边的按钮“Cre…

深入《C++ Core Guidelines解析》:提升C++编程实践的关键指南

目录 1、写在前面2、推荐理由3、内容介绍4、作者介绍5、赠书 or 购买 1、写在前面 C Core Guidelines是一个正在进行的开源项目&#xff0c;通过将广泛认可的现代C上佳实践集中在一个地方来解决这些问题。Core Guidelines依赖于几十年的经验和早期的编码规则。它们与C本身共享一…

数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)

目录 方法一 算法视频分析 方法二 算法视频分析 Q&#xff1a;什么是“就地”捏&#xff1f; A&#xff1a;就是指辅助空间复杂度为O(1)&#xff0c;通俗一点来说就是不需要再开辟一块空间来实现算法。 特别说明&#xff1a; 笔者第一次录制视频&#xff0c;言语有些不顺&…

MySQL——常见问题

NULL和空值的区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0c;只能查出字段中没有不为NULL的或者为 NULL 的&#xff0c;不能查出空值。 3、判断NULL 用IS NULL 或者 is no…

Win10 ping 虚拟机kali 请求超时解决办法

出现这种问题应该是windows休眠导致的 这里我的解决方法是先禁用再启用连接 然后再ping 虚拟机ip和kali ip&#xff0c;发现就可以连上了

vue前后端端口不一致解决方案

在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…