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文件 4、 仓库地址 5、总结
记录自己对于Qt实现文件传输客户端的学习过程,方便自己日后回顾,也可以给别人提供参考借鉴。服务器端在主页另外一篇博客
1、 客户端UI界面设计
2、客户端
2.1 添加网络模块和头文件
2.2 创建Tcp对象
private : Ui:: Widget * ui; QTcpSocket * tcpSocket;
tcpSocket = new QTcpSocket ( this ) ;
2.3 连接按钮
2.3.1 连接按钮连接信号与槽
2.3.2 连接按钮实现
void Widget :: on_connectPushButton_clicked ( )
{ QString ip = ui-> ipLineEdit-> text ( ) ; quint16 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 ) { fileName = QString ( message) . section ( "##" , 0 , 0 ) ; fileSize = QString ( message) . section ( "##" , 1 , 1 ) . toInt ( ) ; 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 ) ;
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; bool isFileMes; QFile file; QString fileName; qint64 fileSize; qint64 recFileSize; } ;
# endif
3.2 .cpp文件
# include "widget.h"
# include "ui_widget.h" Widget :: Widget ( QWidget * parent) : QWidget ( parent) , ui ( new Ui:: Widget)
{ ui-> setupUi ( this ) ; this -> setAttribute ( Qt:: WA_TranslucentBackground) ; tcpSocket = new QTcpSocket ( this ) ; 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 ( ) ; quint16 port = ui-> portLineEdit-> text ( ) . toUInt ( ) ; tcpSocket-> connectToHost ( ip, port) ;
}
void Widget :: readFileHandle ( )
{ QByteArray message = tcpSocket-> readAll ( ) ; if ( isFileMes== true ) { QString masgStr = QString :: fromUtf8 ( message) ; fileName = masgStr. section ( "##" , 0 , 0 ) ; fileSize = masgStr. section ( "##" , 1 , 1 ) . toLongLong ( ) ; file. setFileName ( fileName) ; bool isOpen = file. open ( QIODevice:: WriteOnly) ; if ( isOpen == false ) { QMessageBox :: warning ( this , "打开文件" , "文件打开失败" ) ; tcpSocket-> disconnectFromHost ( ) ; tcpSocket-> close ( ) ; } ui-> sendprogressBar-> setMaximum ( 100 ) ; 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实现文件传输客户端的整个过程了,服务端在另外一篇博客,浏览过程中,如若发现错误,欢迎 大家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!世界 扑朔迷离,愿我们保持冷静,继续前行!