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