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

相关推荐
谱写秋天1 分钟前
Qt 5.5 的安装与配置(使用 VSCode编辑)
开发语言·vscode·qt
项目申报小狂人2 分钟前
算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
开发语言·算法·matlab
阿珊和她的猫4 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234177 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~7 小时前
C#---StopWatch类
开发语言·c#
lifallen8 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研8 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO10 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试10 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑11 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法