当前位置: 首页 > news >正文

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实现文件传输客户端的整个过程了,服务端在另外一篇博客,浏览过程中,如若发现错误,欢迎

大家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!世界

扑朔迷离,愿我们保持冷静,继续前行!

相关文章:

  • WPF 图标原地旋转
  • 4.16学习总结 IO流综合练习
  • 新闻业务--草稿箱
  • 坚持每日Codeforces三题挑战:Day 3 - 题目详解(2024-04-16,难度:900, 1200, 1200)
  • 库洛游戏一面+二面
  • C#中同步任务和异步任务
  • 【计算机网络】3数据链路层①
  • Mathematica 中,将含有小数的表达式转换为整数或分数形式
  • springboot异步线程事务丢失
  • MAC-​​基于 Spring 框架的高并发批量任务处理方案​
  • 【AI】SpringAI 第二弹:接入 DeepSeek 官方服务
  • Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践
  • CTF--好像需要管理员
  • gemini讲USRP
  • 【Java】时间区间内按天、周、月份索引后缀计算方法
  • 通过金融科技(Fintech)掌控财务:智能理财管理指南
  • Design Compiler:转换时间过渡调整
  • 加油站小程序实战教程11会员注册
  • LeetCode面试热题150中19-22题学习笔记(用Java语言描述)
  • 链表知识回顾
  • 河北建筑工程网/上海最大的seo公司
  • 青海公司网页设计/百度的seo排名怎么刷
  • 网站系统下载不了文件/seo还有前景吗
  • 做网站模板的海报尺寸多少钱/电商运营数据六大指标
  • 陕西省信用建设门户网站/南宁做网站公司
  • 移动端原型/网络seo优化公司