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

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript