2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图

Qt实现TCP连接

服务器端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpServer>//服务器端类
#include<QTcpSocket>//客户端类
#include<QMessageBox>//消息对话框类
#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 newconnection_slot();//newconnect对应的槽函数声明void readyRead_slot();//readyRead对应的槽函数声明
private slots:void on_startBtn_clicked();private:Ui::Widget *ui;QTcpServer *server;//实例化一个服务器指针QList<QTcpSocket *>socketList;//定义一个容器存放客户端
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

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;
}
//newconnection信号对应的槽函数实现
void Widget::newconnection_slot()
{//获取最新连接的客户端的套接字QTcpSocket *s=server->nextPendingConnection();//将客户端套接字存放到容器列表中socketList.push_back(s);//将readyRead信号连接到自定义的槽函数中connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//readyRead对应的槽函数实现
void Widget::readyRead_slot()
{//读取客户端的数据//移除无效客户端for(int i=0;i<socketList.count();i++){//判断客户端与服务器的连接状态 未连接UnconnectedState枚举值:0if(socketList.at(i)->state()==QTcpSocket::UnconnectedState)//==0也可{socketList.removeAt(i);//通过下标删除该元素}}//遍历有效客户端中哪些客户端有数据带读for(int i=0;i<socketList.count();i++){//判断套接字中有没有数据if(socketList.at(i)->bytesAvailable()!=0){//读取客户端中的数据QByteArray msg=socketList.at(i)->readAll();//将读取到的信息放入ui界面上ui->msgWidget->addItem(QString::fromLocal8Bit(msg));//addItem==setText//将该数据内容广播给所有人for(int j=0;j<socketList.count();j++){//将数据写入所有客户端的套接字中socketList.at(j)->write(msg);}}}
}//启动按钮对应的槽函数处理
void Widget::on_startBtn_clicked()
{//获取UI界面的端口号 toUInt将字符串转换成整型quint16 port=ui->portEdit->text().toUInt();//设置监听if(server->listen(QHostAddress::Any,port)){//弹出消息对话框QMessageBox::information(this,"","启动服务器成功!");//设置启动按钮不可用ui->startBtn->setEnabled(false);}else{QMessageBox::information(this,"","启动服务器失败!");return;}//将客户端发来的newConnection信号连接到自定义的槽函数connect(server,&QTcpServer::newConnection,this,&Widget::newconnection_slot);
}

widget.ui

客户端:

widget.h

#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 on_sendBtn_clicked();void on_disconnectBtn_clicked();public slots:void connected_slot();//connected对应的槽函数声明void readyRead_slot();//readyRead对应的槽函数声明void disconnect_slot();//disconnected对应的槽函数声明private:Ui::Widget *ui;//实例化一个客户端指针QTcpSocket *socket;QString userName;//存放用户名
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

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);//设置初始化界面 给msgEdit、sendEdit、disconnectBtn设置不可用ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//将connected信号连接到自定义的槽函数connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
}Widget::~Widget()
{delete ui;
}//连接按钮对应的槽函数处理
void Widget::on_connectBtn_clicked()
{//获取UI界面上的IP和端口号QString ip=ui->IPEdit->text();quint16 port=ui->portEdit->text().toUInt();//将字符串转换为整型//连接服务器socket->connectToHost(ip,port);//将readyRead信号和自定义槽函数连接connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//connected对应的槽函数实现
void Widget::connected_slot()
{//弹出消息对话框 提示用户连接成功QMessageBox::information(this,"","连接服务器成功!");//将msgEdit、sendEdit、disconnectBtn设置可用ui->msgEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);//将connectBtn、userNameEdit、IPEdit、portEdit设置不可用ui->connectBtn->setEnabled(false);ui->userNameEdit->setEnabled(false);ui->IPEdit->setEnabled(false);ui->portEdit->setEnabled(false);//告诉服务器xxx上线了userName=ui->userNameEdit->text();QString msg=userName+":进入聊天室!";//将msg发送给服务器socket->write(msg.toLocal8Bit());
}
//readyRead对应的槽函数实现
void Widget::readyRead_slot()
{//读取数据QByteArray msg=socket->readAll();//将读取的数据放入ui界面上ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
//disconnect对应的槽函数
void Widget::disconnect_slot()
{//将客户端与服务器端断开连接socket->disconnectFromHost();
}
//发送按钮对应的槽函数处理
void Widget::on_sendBtn_clicked()
{//将msgEdit文本发送给服务器QString msg=userName+":"+ui->msgEdit->text();socket->write(msg.toLocal8Bit());ui->msgEdit->clear();//清空msgEdit
}
//disconnectBtn按钮对应的槽函数处理
void Widget::on_disconnectBtn_clicked()
{//告诉服务器xxx下线了QString msg=userName+":离开聊天室";socket->write(msg.toLocal8Bit());//将msgEdit、sendEdit、disconnectBtn设置不可用ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//将connectBtn、userNameEdit、IPEdit、portEdit设置可用ui->connectBtn->setEnabled(true);ui->userNameEdit->setEnabled(true);ui->IPEdit->setEnabled(true);ui->portEdit->setEnabled(true);QMessageBox::information(this,"","断开连接成功!");
}

widget.ui

运行结果:

服务器端初始状态:

 填写端口号启动服务器之后:

 客户端初始状态:

 输入用户名、IP地址、端口号、点击连接之后:

 客户端发送消息给服务器端:

客户端断开连接之后:

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

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

相关文章

笔记72:关于IMU(惯性测量单元)传感器的作用【不涉及公式推导】

一、IMU传感器是什么&#xff1a; 惯性测量单元IMU&#xff08;Inertial Measurement Unit&#xff09;是一种使用【加速度计】和【陀螺仪】来测量【物体三轴姿态角&#xff08;空间姿态&#xff09;】的装置&#xff1b;IMU在坐标系的每个坐标轴上&#xff0c;均安装有1个陀螺…

分销小程序的常见功能

分销小程序是一种非常有前景和潜力的产品形式&#xff0c;可以帮助企业快速拓展销售渠道&#xff0c;增加销售额。下面我将介绍分销小程序的常见功能。 1. **分销商注册与管理**&#xff1a;支持任何用户自动成为分销商&#xff0c;也可以支持有会员等级&#xff08;或付费或审…

计算机网络:IP

引言&#xff1a; IP协议是互联网协议族中的核心协议之一&#xff0c;负责为数据包在网络中传输提供路由寻址。它定义了数据包如何在互联网上从源地址传输到目的地址的规则和流程。IP协议使得各种不同类型的网络设备能够相互通信&#xff0c;实现了全球范围内的信息交换。 目录…

第三百七十八回

文章目录 1. 概念介绍2. 实现方法2.1 maskFilter2.2 shader 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"两种阴影效果"相关的内容&#xff0c;本章回中将介绍如何绘制阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

StarRocks实战——携程酒店实时数仓

目录 一、实时数仓 二、实时数仓架构介绍 2.1 Lambda架构 2.2 Kappa架构 三、携程酒店实时数仓架构 3.1 架构选型 3.2 实时计算引擎选型 3.3 OLAP选型 四、携程酒店实时订单 4.1 数据源 4.2 ETL数据处理 4.3 应用效果 4.4 总结 原文大佬的这篇实时数仓建设案例有借…

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root&#xff08;God用户类似LINUX的root&#xff09; 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…

Sentinel实战(待完善)

目录 服务雪崩 什么是服务雪崩 服务不可用原因 解决方案 技术选型对比 Sentinel 介绍 优点 核心概念 资源 规则 代码实战 API实现 SentinelResource注解实现 Sentinel控制台 启动控制台服务 java应用接入控制台 微服务接入Sentinel 服务雪崩 什么是服务雪崩…

1、docker入门

文章目录 1、tocker简介2、tocker的安装&环境配置2、配置阿里云镜像3、基本命令1、镜像命令2、docker基本命令3、镜像基本命令4、Docker 容器常用命令 1、tocker简介 新一代的虚拟化技术 2、tocker的安装&环境配置 uname -r1、首先查看liunx的内核 yum update -y2、更…

uniapp npx update-browserslist-db@lates 问题解决

在uniapp运行项目时&#xff0c;会有这种报错&#xff0c;其实这是表明browserslistlatest版本低了&#xff0c;在催你升级版本&#xff0c;browserslistlatest是用来支持解析css用的&#xff0c;当然&#xff0c;你也可以直接忽略这个报错提示&#xff0c;也可以正常运行项目。…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业(2024)

对于OpenAI推出的Sora模型&#xff0c;我们可以进一步探讨其可能的技术细节、潜在应用以及对AI视频行业的影响。 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作…

day05_用户管理minIO角色分配(页面制作,查询用户,添加用户,修改用户,删除用户,用户头像,查询所有角色,保存角色数据)

文章目录 1 用户管理1.1 页面制作1.2 查询用户1.2.1 需求说明1.2.2 后端接口需求分析SysUserSysUserDtoSysUserControllerSysUserServiceSysUserMapperSysUserMapper.xml 1.2.3 前端对接实现思路sysUser.jssysRole.vue 1.3 添加用户1.3.1 需求说明1.3.2 页面制作1.3.3 后端接口…

ky10-server docker 离线安装包、离线安装

离线安装脚本 # ---------------离线安装docker------------------- rpm -Uvh --force --nodeps *.rpm# 修改docker拉取源为国内 rm -rf /etc/docker mkdir -p /etc/docker touch /etc/docker/daemon.json cat >/etc/docker/daemon.json<<EOF{"registry-mirro…

力扣hot100题解(python版48-50题)

48、路径总和III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

力扣hot100题解(python版41-43题)

41、二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

Unity将4个纹理图拼接成1个纹理

需要的效果 最终实现的效果大概如下: 4个贴图上去 这里随便放一个切分的图。 Shader代码如下 直接上代码: // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)// Unlit shader. Simplest possible textured shad…

DFA还原白盒AES密钥

本期内容是关于某app模拟登录的,涉及的知识点比较多,有unidbg补环境及辅助还原算法,ida中的md5以及白盒aes,fart脱壳,frida反调试 本章所有样本及资料均上传到了123云盘 llb资料官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 目录 首先抓包 fart脱壳 加密位置定位…

JavaWeb--JDBC

一&#xff1a;JDBC概述 1.概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 2.本质 官方&#xff08; sun 公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口&#xff1b;各个…

【C语言】熟悉文件基础知识

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 文件 为了数据持久化保存&#xff0c;使用文件&#xff0c;否则数据存储在内存中&#xff0c;程序退出&#xff0c;内存回收&#xff0c;数据就会丢失。 程序设计中&…

代码随想录算法训练营第46天| 139.单词拆分、背包问题总结

139.单词拆分 完成 思路&#xff1a; 本题可以用背包问题的思路解决&#xff0c;单词是物品&#xff0c;字符串是背包&#xff0c;要求物品能否把背包装满。 dp[j] 字符串长度为j时&#xff0c;能否拆分为一个或多个在字典中出现的单词。 递推公式为&#xff1a;if([i, j] 这个…

“平民化”非结构数据处理

在全球信息产业高速发展的背景下&#xff0c;IDC预测&#xff0c;2018 到 2025 年之间&#xff0c;全球产生的数据量将会从 33 ZB 增长到 175 ZB&#xff0c; 复合增长率27%&#xff0c;其中超过 80%的数据都会是处理难度较大的非结构化数据&#xff0c;如文档、文本、图形、图…