1、介绍
FTP是基于TCP/IP的一种应用层文件传输协议,通过建立FTP服务器(默认端口21)-客服端的形式在各个主机间传输文件。
Qt5.0之后移除了QFtp类(基于FTP协议实现的一个类),使用 QNetworkAccessManager 可以实现 Ftp 的上传/下载功能,后者在性能上和稳定性上有所提升。但有些原本 QFtp 有的功能 QNetworkAccessManager 却没有提供,例如:list、cd、remove、mkdir、rmdir、rename 等,前者的功能更加完善,提供的API更多,更加便于开发者使用。最为新手练习或者开发FTP相关功能和一般的应用,当然选择QFtp更加有利。
使用QFtp只需要把编译好的类文件添加到项目中即可,Qftp类文件下载地址:
百度网盘链接: https://pan.baidu.com/s/1nbuKK6Tv35RowRsXwpuWUw?pwd=5suc
2、准备
1、需要已经配置好的FTP服务器
2、工程文件中需要添加
QT += network
设计图


文件结构,其中红框圈住的是新增的项目文件,qftp和qurlinfo是添加进入项目的Qftp类文件。

3、功能要点
1、登陆模式设置成被动连接,否则连接服务器和登录会异常
m_ftp->setTransferMode(QFtp::TransferMode::Passive);
2、treeWidget的右键菜单出现位置,需要特殊处理,不可以直接使用pos,pos位置并不是鼠标实际显示的位置。
//校正鼠标点的位置,保证菜单出现在鼠标点击的位置
QPoint localPnt = ui->treeWidget->viewport()->mapToGlobal(pos);
pMenu->exec(localPnt);
3、ftp服务器上文件路径地址的问题。登陆成功默认进入ftp服务器文件夹的根目录,根据用户操作来确定所进入的文件夹和目录地址,所以可以添加变量来确定当前文件所在目录。
4、完整代码
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QTreeWidget>
#include "qftp.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void closeEvent(QCloseEvent *event) override;
private:
void InitSlot();
//登录ftp服务器
void Login();
//操作提示
void OperationInfo(const QString& info,QMessageBox::Icon icon);
//修改按钮状态
void ActionStatus(bool enable);
private slots:
//响应命令开始
void OnFtpCommandStart(int commandId);
//响应命令结束
void OnFtpCommandFinished(int commandId,bool isError);
//响应展示文件列表
void OnAddListInfo(const QUrlInfo& urlInfo);
//响应进度条
void OnUpdateProgress(qint64 readBytes,qint64 totalBytes);
//响应返回上一级
void OnActionBackToParent();
//响应上传信号
void OnActionUpload();
//响应下载信号
void OnActionDowload();
//响应获取文件列表操作
void OnActionList();
//响应新建操作
void OnActionNewFile();
//响应删除操作
void OnActionRemove();
//响应treeWidget点击Item事件
void OnTreeWidgetItemActived(QTreeWidgetItem *item, int column);
//响应treeWidget右

9068

被折叠的 条评论
为什么被折叠?



