Qt实现FTP的上传和下载的实例代码
发布时间 - 2026-01-11 02:25:18 点击率:次为了方便网络编程,Qt 提供了 Network 模块。该模块包含了许多类,本文介绍了Qt实现FTP的上传和下载,分享给大家

本来想简单抄抄书,随便手写个Ftp客户端的,结果发现教材上的是基于Qt4的QFtp类库,而在Qt5中取消了这一个类库(同时也取消了QHttp等的类),取而代之的是QNetworkAccessManager 这个类,把这些杂货全都揽下来了,据说是因为之前的两个类有重复而且效率有问题balabala。于是就百度了一下,发现百度上要么讲的不全,要么就是要去下一个由热心网民重新封装的QFtp类。显然我并不喜欢无脑复制粘贴,想好好看下Qt官方提供的东西的用法,深入的理解下Qt网络编程,于是就果断自行google(话说google真好用),加上查看帮助文档,终于把一个简版的Ftp客户端大概框架弄清楚了。
不多说,上源码:
Dialog.pro
#------------------------------------------------- # # Project created by QtCreator 2015-10-29T23:52:56 # #------------------------------------------------- QT += core gui QT += network #这里要添加这个库 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = QFtp TEMPLATE = app SOURCES += main.cpp dialog.cpp HEADERS += dialog.h
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
//注意需要添加的头文件
#include<QDialog>
#include<QPushButton>
#include<QFile>
#include<QNetworkReply>
#include<QLineEdit>
#include<QtNetwork/QNetworkAccessManager>
#include<QtNetwork/QNetworkRequest>
#include<QLabel>
#include<QString>
#include<QGridLayout>
#include<QMessageBox>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
public:
QGridLayout *layout;
QLabel *LbServer,*LbUser,*LbPasswd;
QLineEdit *LeServer,*LeUser,*LePasswd;
QPushButton *PbPut,*PbGet;
QNetworkAccessManager manager;//这个是重点
protected slots:
//处理按钮的点击信号
void slotPut();
void slotGet();
//处理网络连接的信号
void managePut(QNetworkReply*);
void manageGet(QNetworkReply*);
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("My Ftp");
layout=new QGridLayout(this);
LbServer=new QLabel("Server:");
LbUser=new QLabel("User:");
LbPasswd=new QLabel("Passwd:");
LeServer=new QLineEdit("ftp://120.27.41.126/home/myths/1.txt");
LeUser=new QLineEdit("myths");
LePasswd=new QLineEdit("123456");
LePasswd->setEchoMode(QLineEdit::Password);//设置加密显示
PbPut=new QPushButton("Put");
PbGet=new QPushButton("Get");
layout->addWidget(LbServer,0,0);
layout->addWidget(LeServer,0,1);
layout->addWidget(LbUser,1,0);
layout->addWidget(LeUser,1,1);
layout->addWidget(LbPasswd,2,0);
layout->addWidget(LePasswd,2,1);
layout->addWidget(PbPut,3,0);
layout->addWidget(PbGet,3,1);
setFixedSize(300,200);//固定大小
//按钮点击事件信号槽的连接
connect(PbPut,SIGNAL(clicked()),this,SLOT(slotPut()));
connect(PbGet,SIGNAL(clicked()),this,SLOT(slotGet()));
}
void Dialog::managePut(QNetworkReply * reply){
qDebug()<<reply->error();//输出调试信息
switch(reply->error()){//判断连接后的状态
case QNetworkReply::NoError:
QMessageBox::information(this,"Put information","Upload Success!");
break;
case QNetworkReply::HostNotFoundError:
QMessageBox::information(this,"Put information","Host Not Found!");
break;
case QNetworkReply::AuthenticationRequiredError:
QMessageBox::information(this,"Put information","Login Failure!");
break;
default:
QMessageBox::information(this,"Put information","Unknown Failure");
break;
}
}
void Dialog::manageGet(QNetworkReply *reply){
//基本和managerPut类似
qDebug()<<reply->error();
QByteArray data;
switch(reply->error()){
case QNetworkReply::NoError:
data=reply->readAll();//从url中读取文件内容,输出到data中(也可以再将数据写入到文件中,为了方便,这里就权且打印一下吧)
QMessageBox::information(this,"Put information","Upload Success!nThe file you've got is :n"+data);
break;
case QNetworkReply::HostNotFoundError:
QMessageBox::information(this,"Put information","Host Not Found!");
break;
case QNetworkReply::AuthenticationRequiredError:
QMessageBox::information(this,"Put information","Login Failure!");
break;
default:
QMessageBox::information(this,"Put information","Unknown Failure");
break;
}
}
Dialog::~Dialog()
{
}
void Dialog::slotPut(){
//判断信息输入完整
if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
QMessageBox::warning(this,"Error","Please fill in the information");
return ;
}
//重点!将之前的槽清空并重新连接至需要的
manager.disconnect(SIGNAL(finished(QNetworkReply*)));
//完全清空某对象连接的槽可以用manager.disconnect();
connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(managePut(QNetworkReply*)));
//设置登录信息
QUrl url(LeServer->text());
url.setPort(21);
url.setUserName(LeUser->text());
url.setPassword(LePasswd->text());
QByteArray data="This is the test data.n";
/*QNetworkReply *reply=*/
manager.put(QNetworkRequest(url),data);//将data上传到url中,返回的reply将触发网络的连接信号
}
void Dialog::slotGet(){
//基本意义与slotPut类似
if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
QMessageBox::warning(this,"Error","Please fill in the information");
return ;
}
manager.disconnect(SIGNAL(finished(QNetworkReply*)));
connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(manageGet(QNetworkReply*)));
QUrl url(LeServer->text());
url.setPort(21);
url.setUserName(LeUser->text());
url.setPassword(LePasswd->text());
/*QNetworkReply *reply=*/
manager.get((QNetworkRequest(url)));
}
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
5、运行截图
权且只显示主界面:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Qt
# FTP上传
# FTP下载
# Qt QFtp客户端实现上传下载文件
# QT实现FTP上传文件
# 基于QT实现文件上传和下载功能
# 的是
# 清空
# 网络编程
# 客户端
# 类库
# 这一
# 取消了
# 可以用
# 而在
# 要去
# 给大家
# 只显示
# 好用
# 多说
# 取而代之
# 不全
# 再将
# 想好
# 弄清楚
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel中的withCount方法怎么高效统计关联模型数量
韩国服务器如何优化跨境访问实现高效连接?
Laravel如何为API生成Swagger或OpenAPI文档
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel怎么为数据库表字段添加索引以优化查询
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
JavaScript如何实现继承_有哪些常用方法
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
高端企业智能建站程序:SEO优化与响应式模板定制开发
HTML 中动态设置元素 name 属性的正确语法详解
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何批量查询域名的建站时间记录?
php结合redis实现高并发下的抢购、秒杀功能的实例
jQuery中的100个技巧汇总
详解jQuery停止动画——stop()方法的使用
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何在IIS中新建站点并配置端口与物理路径?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
网易LOFTER官网链接 老福特网页版登录地址
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
,交易猫的商品怎么发布到网站上去?
android nfc常用标签读取总结
Laravel如何使用Service Container和依赖注入?(代码示例)
javascript日期怎么处理_如何格式化输出
js实现点击每个li节点,都弹出其文本值及修改
如何在橙子建站中快速调整背景颜色?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
javascript基于原型链的继承及call和apply函数用法分析
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
网站优化排名时,需要考虑哪些问题呢?
Linux系统命令中screen命令详解
如何快速搭建高效WAP手机网站?
大连 网站制作,大连天途有线官网?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
浅谈Javascript中的Label语句
手机软键盘弹出时影响布局的解决方法
Laravel如何与Pusher实现实时通信?(WebSocket示例)

