Qt实现文件传输客户端(图文详解+代码详细注释)

Qt实现文件传输客户端

  • [1、 客户端UI界面设计](#1、 客户端UI界面设计)
  • 2、客户端
  • [2.1 添加网络模块和头文件](#2.1 添加网络模块和头文件)
  • [2.2 创建Tcp对象](#2.2 创建Tcp对象)
  • [2.3 连接按钮](#2.3 连接按钮)
    • [2.3.1 连接按钮连接信号与槽](#2.3.1 连接按钮连接信号与槽)
    • [2.3.2 连接按钮实现](#2.3.2 连接按钮实现)
  • [2.4 读取文件](#2.4 读取文件)
  • [2.4.1 连接读取文件的信号与槽](#2.4.1 连接读取文件的信号与槽)
  • [2.4.2 读取文件槽函数实现](#2.4.2 读取文件槽函数实现)
  • [2.5 进度条](#2.5 进度条)
    • [2.5.1 设置进度条初始值](#2.5.1 设置进度条初始值)
    • [2.5.2 初始化进度条](#2.5.2 初始化进度条)
    • [2.5.3 更新进度条](#2.5.3 更新进度条)
  • [2.6 传输成功](#2.6 传输成功)
  • [3、 头文件和.cpp文件](#3、 头文件和.cpp文件)
    • [3.1 头文件](#3.1 头文件)
    • [3.2 .cpp文件](#3.2 .cpp文件)
  • [4、 仓库地址](#4、 仓库地址)
  • 5、总结

|------------------------------------------------------------|
| 记录自己对于Qt实现文件传输客户端的学习过程,方便自己日后回顾,也可以给别人提供参考借鉴。服务器端在主页另外一篇博客 |

1、 客户端UI界面设计

2、客户端

2.1 添加网络模块和头文件


2.2 创建Tcp对象

cpp 复制代码
private:
    Ui::Widget *ui;
    QTcpSocket *tcpSocket;          //声明Tcp对象指针
cpp 复制代码
tcpSocket = new QTcpSocket(this);       //创建客户端Tcp对象

2.3 连接按钮

2.3.1 连接按钮连接信号与槽

|----------------|
| 右键连接按钮,选择转到槽 |

|---------------|
| 选择clicked() |

2.3.2 连接按钮实现

cpp 复制代码
//连接按钮
void Widget::on_connectPushButton_clicked()
{
    QString ip = ui->ipLineEdit->text();      //获取ip
    quint16 port = ui->portLineEdit->text().toUInt();       //获取端口
    
    tcpSocket->connectToHost(ip,port);          //连接服务器
}

2.4 读取文件

2.4.1 连接读取文件的信号与槽

|-------|
| 创建槽函数 |

cpp 复制代码
void readFileHandle();                      //读取文件处理           

|--------|
| 连接信号与槽 |

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

2.4.2 读取文件槽函数实现

|--------------|
| 定义一个文件发送成功状态 |

cpp 复制代码
bool isFileMes;        //文件读取信息
cpp 复制代码
isFileMes = true;      //读取的是文件信息

|------------------|
| 创建文件所需对象,记得添加头文件 |

cpp 复制代码
QFile file;                     //创建文件对象

QString fileName;               //文件名字
qint64 fileSize;                //文件大小
qint64 recFileSize;           //接收文件大小

|-------|
| 实现槽函数 |

cpp 复制代码
//读取文件
void Widget::readFileHandle()
{
    QByteArray message = tcpSocket->readAll();          //接收信息

        if(isFileMes==true)//发送过来的是文件信息
        {
            //1、接收文件信息并拆包
            //hello##1024 拆包
            fileName = QString(message).section("##",0,0);        //获取文件名,hello
            fileSize = 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 设置进度条初始值

cpp 复制代码
ui->sendprogressBar->setValue(0);          //设置进度条初始值

2.5.2 初始化进度条

cpp 复制代码
//初始化进度条
//初始化进度条
ui->sendprogressBar->setMaximum(100);     //设置进度条最大值,qint64->int
ui->sendprogressBar->setValue(0);               //设置当前值

2.5.3 更新进度条

cpp 复制代码
//更新进度条
int progress = static_cast<int>((recFileSize * 100) / fileSize);
ui->sendprogressBar->setValue(progress);   

2.6 传输成功

3、 头文件和.cpp文件

3.1 头文件

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QFile>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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文件

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();      //获取ip
    quint16 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);        //获取文件名,hello
            fileSize = 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->int
            ui->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实现文件传输客户端的整个过程了,服务端在另外一篇博客,浏览过程中,如若发现错误,欢迎 大家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!世界 扑朔迷离,愿我们保持冷静,继续前行! |

相关推荐
SmartRadio3 小时前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
rfidunion4 小时前
QT5.7.0编译移植
开发语言·qt
rit84324994 小时前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
大、男人4 小时前
python之asynccontextmanager学习
开发语言·python·学习
hqwest4 小时前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit
一只小bit5 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
AC赳赳老秦5 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
不知道累,只知道类5 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
国强_dev5 小时前
Python 的“非直接原因”报错
开发语言·python
YMatrix 官方技术社区5 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix