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

相关推荐
lllsure1 小时前
Python基础语法
开发语言·python
zxctsclrjjjcph2 小时前
【高并发内存池】从零到一的项目之centralcache整体结构设计及核心实现
开发语言·数据结构·c++·链表
zm3 小时前
服务器多客户端连接核心要点(1)
java·开发语言
炯哈哈3 小时前
【上位机——MFC】单文档和多文档视图架构
开发语言·c++·mfc·上位机
FuckPatience3 小时前
关于C#项目中 服务层使用接口的问题
java·开发语言·c#
编程轨迹_3 小时前
使用 Spring 和 Redis 创建处理敏感数据的服务
java·开发语言·restful
赵和范4 小时前
C++:书架
开发语言·c++·算法
boooo_hhh4 小时前
第J7周:对于ResNeXt-50算法的思考
开发语言·python·深度学习
若水晴空初如梦4 小时前
QT聊天项目DAY10
qt·bootstrap·mybatis
LSL666_5 小时前
Java——多态
java·开发语言·多态·内存图