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