为了方便网络编程,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实现文件上传和下载功能
# 的是
# 清空
# 网络编程
# 客户端
# 类库
# 这一
# 取消了
# 可以用
# 而在
# 要去
# 给大家
# 只显示
# 好用
# 多说
# 取而代之
# 不全
# 再将
# 想好
# 弄清楚
# 大家多多
相关文章:
如何批量查询域名的建站时间记录?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
相册网站制作软件,图片上的网址怎么复制?
如何通过万网虚拟主机快速搭建网站?
如何用美橙互联一键搭建多站合一网站?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
孙琪峥织梦建站教程如何优化数据库安全?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
Swift开发中switch语句值绑定模式
已有域名能否直接搭建网站?
宁波免费建站如何选择可靠模板与平台?
网站设计制作企业有哪些,抖音官网主页怎么设置?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
定制建站哪家更专业可靠?推荐榜单揭晓
北京网站制作网页,网站升级改版需要多久?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
官网网站制作腾讯审核要多久,联想路由器newifi官网
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
已有域名和空间,如何快速搭建网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
如何在万网自助建站平台快速创建网站?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
高端云建站费用究竟需要多少预算?
建站主机数据库如何配置才能提升网站性能?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
网站制作模板下载什么软件,ppt模板免费下载网站?
微信小程序 input输入框控件详解及实例(多种示例)
如何快速生成ASP一键建站模板并优化安全性?
建站主机空间推荐 高性价比配置与快速部署方案解析
江苏网站制作公司有哪些,江苏书法考级官方网站?
建站之星3.0如何解决常见操作问题?
C++中引用和指针有什么区别?(代码说明)
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
建站与域名管理如何高效结合?
网站制作需要会哪些技术,建立一个网站要花费多少?
如何用PHP快速搭建高效网站?分步指南
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
Swift中循环语句中的转移语句 break 和 continue
Python如何创建带属性的XML节点
如何在搬瓦工VPS快速搭建网站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
,购物网站怎么盈利呢?
如何在Golang中指定模块版本_使用go.mod控制版本号
建站之星伪静态规则如何设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。