Qt实现文件传输客户端(图文详解+代码详细注释)
Qt实现文件传输客户端
- 1、 客户端UI界面设计
- 2、客户端
- 2.1 添加网络模块和头文件
- 2.2 创建Tcp对象
- 2.3 连接按钮
- 2.3.1 连接按钮连接信号与槽
- 2.3.2 连接按钮实现
- 2.4 读取文件
- 2.4.1 连接读取文件的信号与槽
- 2.4.2 读取文件槽函数实现
- 2.5 进度条
- 2.5.1 设置进度条初始值
- 2.5.2 初始化进度条
- 2.5.3 更新进度条
- 2.6 传输成功
- 3、 头文件和.cpp文件
- 3.1 头文件
- 3.2 .cpp文件
- 4、 仓库地址
- 5、总结
| 记录自己对于Qt实现文件传输客户端的学习过程,方便自己日后回顾,也可以给别人提供参考借鉴。服务器端在主页另外一篇博客 |
1、 客户端UI界面设计

2、客户端
2.1 添加网络模块和头文件


2.2 创建Tcp对象
private:Ui::Widget *ui;QTcpSocket *tcpSocket; //声明Tcp对象指针

tcpSocket = new QTcpSocket(this); //创建客户端Tcp对象

2.3 连接按钮
2.3.1 连接按钮连接信号与槽
右键连接按钮,选择转到槽 |

选择clicked() |

2.3.2 连接按钮实现
//连接按钮
void Widget::on_connectPushButton_clicked()
{QString ip = ui->ipLineEdit->text(); //获取ipquint16 port = ui->portLineEdit->text().toUInt(); //获取端口tcpSocket->connectToHost(ip,port); //连接服务器
}
2.4 读取文件
2.4.1 连接读取文件的信号与槽
| 创建槽函数 |
void readFileHandle(); //读取文件处理

| 连接信号与槽 |
connect(tcpSocket,&QTcpSocket::readyRead,this,&Widget::readFileHandle); //连接读取文件的信号与槽

2.4.2 读取文件槽函数实现
| 定义一个文件发送成功状态 |
bool isFileMes; //文件读取信息

isFileMes = true; //读取的是文件信息

| 创建文件所需对象,记得添加头文件 |
QFile file; //创建文件对象QString fileName; //文件名字
qint64 fileSize; //文件大小
qint64 recFileSize; //接收文件大小

| 实现槽函数 |
//读取文件
void Widget::readFileHandle()
{QByteArray message = tcpSocket->readAll(); //接收信息if(isFileMes==true)//发送过来的是文件信息{//1、接收文件信息并拆包//hello##1024 拆包fileName = QString(message).section("##",0,0); //获取文件名,hellofileSize = QString(message).section("##",1,1).toInt(); //获取文件大小,1024//2、创建文件设置为只写file.setFileName(fileName); //创建文件bool isOpen = file.open(QIODevice::WriteOnly);if(isOpen == false){QMessageBox::warning(this,"打开文件","文件打开失败");tcpSocket->disconnectFromHost(); //断开连接tcpSocket->close(); //关闭}}else //接收的是文件内容{qint64 length = file.write(message);recFileSize += length;if(recFileSize == fileSize){QMessageBox::information(this,"接收文件","接收文件完毕");}}
}
2.5 进度条
2.5.1 设置进度条初始值
ui->sendprogressBar->setValue(0); //设置进度条初始值
2.5.2 初始化进度条
//初始化进度条
//初始化进度条
ui->sendprogressBar->setMaximum(100); //设置进度条最大值,qint64->int
ui->sendprogressBar->setValue(0); //设置当前值
2.5.3 更新进度条
//更新进度条
int progress = static_cast<int>((recFileSize * 100) / fileSize);
ui->sendprogressBar->setValue(progress);
2.6 传输成功

3、 头文件和.cpp文件
3.1 头文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QFile>
#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_connectPushButton_clicked(); //连接按钮void readFileHandle(); //读取文件处理private:Ui::Widget *ui;QTcpSocket *tcpSocket; //声明Tcp对象指针bool isFileMes; //文件读取信息QFile file; //创建文件对象QString fileName; //文件名字qint64 fileSize; //文件大小qint64 recFileSize; //接收文件大小};
#endif // WIDGET_H
3.2 .cpp文件
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// this->setWindowFlag(Qt::FramelessWindowHint); //去窗口this->setAttribute(Qt::WA_TranslucentBackground); //半透明背景tcpSocket = new QTcpSocket(this); //创建客户端Tcp对象isFileMes = true; //读取的是文件信息ui->sendprogressBar->setValue(0); //设置进度条初始值connect(tcpSocket,&QTcpSocket::readyRead,this,&Widget::readFileHandle); //连接读取文件的信号与槽
}Widget::~Widget()
{delete ui;
}//连接按钮
void Widget::on_connectPushButton_clicked()
{QString ip = ui->ipLineEdit->text(); //获取ipquint16 port = ui->portLineEdit->text().toUInt(); //获取端口tcpSocket->connectToHost(ip,port); //连接服务器
}//读取文件
void Widget::readFileHandle()
{QByteArray message = tcpSocket->readAll(); //接收信息if(isFileMes==true)//发送过来的是文件信息{//1、接收文件信息并拆包//hello##1024 拆包QString masgStr = QString::fromUtf8(message);fileName = masgStr.section("##",0,0); //获取文件名,hellofileSize = masgStr.section("##",1,1).toLongLong(); //获取文件大小,1024//2、创建文件设置为只写file.setFileName(fileName); //创建文件bool isOpen = file.open(QIODevice::WriteOnly);if(isOpen == false){QMessageBox::warning(this,"打开文件","文件打开失败");tcpSocket->disconnectFromHost(); //断开连接tcpSocket->close(); //关闭}//初始化进度条ui->sendprogressBar->setMaximum(100); //设置进度条最大值,qint64->intui->sendprogressBar->setValue(0); //设置当前值recFileSize = 0; // 重置接收文件大小isFileMes = false; //转换标志}else //接收的是文件内容{qint64 writelength = file.write(message);if(writelength != message.size()){QMessageBox::warning(this, "错误", "文件写入失败");file.close();tcpSocket->disconnectFromHost();return;}recFileSize += writelength;//更新进度条int progress = static_cast<int>((recFileSize * 100) / fileSize);ui->sendprogressBar->setValue(progress); if(recFileSize == fileSize){QMessageBox::information(this, "成功", "文件接收完成");file.close();isFileMes = true; // 重置标志位,准备接收下一个文件tcpSocket->disconnectFromHost(); // 断开连接或保持连接根据需求}}
}
4、 仓库地址
代码仓库地址
5、总结
| 以上就是实现Qt实现文件传输客户端的整个过程了,服务端在另外一篇博客,浏览过程中,如若发现错误,欢迎 大家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!世界 扑朔迷离,愿我们保持冷静,继续前行! |
相关文章:
Qt实现文件传输客户端(图文详解+代码详细注释)
Qt实现文件传输客户端 1、 客户端UI界面设计2、客户端2.1 添加网络模块和头文件2.2 创建Tcp对象2.3 连接按钮2.3.1 连接按钮连接信号与槽2.3.2 连接按钮实现 2.4 读取文件2.4.1 连接读取文件的信号与槽2.4.2 读取文件槽函数实现2.5 进度条2.5.1 设置进度条初始值2.5.2 初始化进…...
机器学习期末
选择题 以下哪项不是机器学习的类型? A. 监督学习 B.无监督学习 C.半监督学习 D.全监督学习 D 哪一个是机器学习的合理定义? A、机器学习是计算机编程的科学 B、机器学习从标记的数据中学习 C、机器学习是允许机器人智能行动的领域 D、机器学习能使计算机能够在…...
在 Linux 上部署 .NET Core 应用并配置为开机自动启动
在本文中,我们将详细介绍如何在 Linux 系统上部署 .NET Core 应用程序,并配置为开机自动启动。以下是一步一步的详细部署过程,适用于将 .NET Core Web 应用部署到生产环境中。 1. 安装 .NET 运行时和 SDK 首先,确保 Linux 系统上…...
Python多任务编程:进程全面详解与实战指南
1. 进程基础概念 1.1 什么是进程? 进程(Process)是指正在执行的程序,是程序执行过程中的一次指令、数据集等的集合。简单来说,进程就是程序的一次执行过程,它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌,…...
【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框
QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象:(5) 示例代码2:加载目录项在横向列表框显示(6) 现象: 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…...
决策树:ID3,C4.5,CART树总结
树模型总结 决策树部分重点关注分叉的指标,多叉还是单叉,处理离散还是连续值,剪枝方法,以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…...
easyexcel使用模板填充excel坑点总结
1.单层map设置值是{属性},那使用两层map进行设置值,是不是可以使用{属性.属性},以为取出map里字段只用{属性}就可以设置值,那再加个.就可以从里边map取出对应属性,没有两层map写法 填充得到的文件打开报错 was empty (…...
量子计算与经典计算融合:开启计算新时代
一、引言 随着科技的飞速发展,计算技术正迎来一场前所未有的变革。量子计算作为前沿技术,以其强大的并行计算能力和对复杂问题的高效处理能力,吸引了全球科技界的关注。然而,量子计算并非要完全取代经典计算,而是与经典…...
C# LINQ基础知识
简介 LINQ(Language Integrated Query),语言集成查询,是一系列直接将查询功能集成到 C# 语言的技术统称。使用LINQ表达式可以对数据集合进行过滤、排序、分组、聚合、串联等操作。 例子: public class Person {public int Id;public string…...
GCoNet+:更强大的团队协作 Co-Salient 目标检测器 2023 GCoNet+(翻译)
摘要 摘要:本文提出了一种新颖的端到端群体协作学习网络,名为GCoNet,它能够高效(每秒250帧)且有效地识别自然场景中的共同显著目标。所提出的GCoNet通过基于以下两个关键准则挖掘一致性表示,实现了共同显著…...
QT常见输入类控件及其属性
Line Edit QLineEdit用来表示单行输入框,可以输入一段文本,但是不能换行 核心属性: 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号,old为先前位置,new为新位置 void …...
Few-shot medical image segmentation with high-fidelity prototypes 论文总结
题目:Few-shot medical image segmentation with high-fidelity prototypes(高精确原型) 论文:Few-shot medical image segmentation with high-fidelity prototypes - ScienceDirect 源码:https://github.com/tntek/D…...
DBA工作常见问题整理
MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一,它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现: 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...
深入理解Java包装类:自动装箱拆箱与缓存池机制
深入理解Java包装类:自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类:基本类型和引用类型。作为一门面向对象编程语言, 一切皆对象是Java语言的设计理念之一。但基本类型不是对象,无法直接参与面向对象操作&…...
如何使用Node-RED采集西门子PLC数据通过MQTT协议实现数据交互并WEB组态显示
需求概述 本章节主要实现一个流程:使用纵横智控的EG网关通过Node-red(可视化编程)采集PLC数据,并通过MQTT协议和VISION(WEB组态)实现数据交互。 以采集西门子PLC为例,要采集的PLC的IP、端口和点…...
【cocos creator 3.x】速通3d模型导入, 模型创建,阴影,材质使用,模型贴图绑定
1、右键创建平面,立方体 2、点击场景根节点,shadows勾选enabled3、点击灯光,shadow enabled勾选 4、点击模型,勾选接收阴影,投射阴影(按照需要勾选) 5、材质创建 6、选中节点,找…...
批量创建OpenStack实例
在Linux终端实现批量创建OpenStack实例,支持支持统计、并发创建、安全确认、重试机制、日志。 #!/bin/bash # # 增强版OpenStack实例创建脚本(修复日志功能) # 功能:支持统计、并发创建、安全确认、重试机制 # 更新日期…...
常用的 SQL 语句分类整理
以下是常用的 SQL 语句分类整理,覆盖数据查询、操作、表管理和高级功能,适用于大多数关系型数据库(如 MySQL、PostgreSQL、SQL Server): 目录 一、数据查询(DQL) 1. 基础查…...
驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…...
【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台
自动生成行业报告,通过调用两个不同的大模型(DeepSeek 和 Qwen),完成从行业趋势分析到结构化报告生成的全过程。 完整代码:https://mp.weixin.qq.com/s/6pHi_aIDBcJKw1U61n1uUg 🧠 1. 整体目的与功能 该脚本实现了一个名为 ReportGenerator 的类,用于: 调用 DeepSe…...
Web前端 (CSS篇)
什么是CSS? css(Cascading Style Sheets)是层叠样式表或级联样式表,是一组设置规则,用于控制web页面外观。 为什么使用CSS? CSS 用于定义网页的样式,包括针对不同设备和屏幕尺寸的设计和布局。 CSS 实例 body {background-col…...
C 语言联合与枚举:自定义类型的核心解析
目录 1.联合体 1.1联合体的声明与创建 1.2联合体在内存中的存储 1.3相同成员的结构体与内存比较 1.4联合体内存空间大小的计算 1.5联合体的应用 2.枚举类型 2.1枚举变量的声明 2.2枚举变量的优点 2.3枚举的使用 上篇博客中,我们通过学习了解了C语言中一种自…...
基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
文章目录 一、服务器选型——给数据库一个舒适的家二、系统调优——打造高性能跑道三、MySQL配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言:从小白…...
golang context源码
解析 context结构 Deadline:返回 context 的过期时间; Done:返回 context 中的 channel; Err:返回错误; Value:返回 context 中的对应 key 的值. type Context interface {Deadline() (deadl…...
【MySQL】MySQL的基础语法及其语句的介绍
1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...
大模型应用开发自学笔记
理论学习地址: https://zh.d2l.ai/chapter_linear-networks/index.html autodl学术加速: source /etc/network_turboconda常见操作: 删除: conda remove --name myenv --all -y导出: conda env export > environment.yml…...
Spring能够有效地解决单例Bean之间的循环依赖问题
在Spring框架中,earlySingletonObjects和singletonObjects是两个与Bean实例化过程密切相关的概念,它们都存储在DefaultSingletonBeanRegistry类中。这两个概念主要用于Spring的依赖注入机制,特别是针对单例Bean的创建过程。 singletonObject…...
【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景
COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件,专注于 Structure-from…...
Linux 离线部署 Docker 18.06.3 终极指南(附一键安装卸载脚本)
Linux 离线部署 Docker 18.06.3 终极指南(附一键安装/卸载脚本) 摘要:本文针对无外网环境的 Linux 服务器,提供基于二进制包的 Docker 18.06.3 离线安装全流程指南。包含自动化脚本设计、服务配置优化及安全卸载方案,…...
