在网上看到很多用QFtp类的实例,但是Qt5中已经没有了去掉了这个类,原因是和 QNetworkAccessManager 的功能重复。
下面介绍用QNetworkAccessManager 类是实现访问ftp的方法。
1.在工程文件.pro文件当中加入
QT += network
2.mainwindow.h当中添加如下几个头文件
#include <qstring.h>
#include <qfile.h>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include "qdebug.h"
#include <QtGui>
3. mainwindow.h 当中添加私有槽
private slots:
void slotError(QNetworkReply::NetworkError code);
void replyFinished(QNetworkReply *reply);
4. mainwindow.h 当中添加自由成员
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
QNetworkReply *reply;
5.在mainwindow.cpp文件当中的初始化函数当中添加如下代码
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QUrl url; //该QUrl类提供了一个方便的接口,用于处理URL
url.setScheme("ftp");//设置该计划描述了URL的类型(或协议)
url.setHost("192.168.1.29");//设置主机地址
url.setPath("/test.txt");//设置URL路径。该路径是自带权限后的URL的一部分,但在查询字符串之前
url.setPort(21);//设置URL的端口。该端口是URL的权限的一部分,如setAuthority(描述)。端口必须是介于0和65535(含)。端口设置为-1表示该端口是不确定的。
url.setPassword("userPassword"); //设置ftp用户密码
url.setUserName("userName");//设置tfp用户名
QNetworkRequest request;//该QNetworkReply类包含的数据和标题,对QNetworkAccessManager发送请求
request.setUrl(url); //这只request的请求
manager = new QNetworkAccessManager;//QNetworkAccessManager 允许发送网络请求和接收回复
reply = manager->get(request);//发送请求,以获得目标要求的内容,并返回一个新的QNetworkReply对象打开阅读,每当新的数据到达发射的readyRead()信号。要求的内容以及相关的头文件会被下载。
//连接信号从发送对象到该对象的方法。相当于连接(发件人,信号,接收方,方法,类型)。
//每个连接都会发射信号,所以复制连接发会出两个信号。可以使用disconnect()断开了连接。
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
6.在mainwindow.cpp文件当中添加两个接收信号的函数
void MainWindow::slotError(QNetworkReply::NetworkError code)
{
qDebug() << reply->errorString();
}
void MainWindow::replyFinished(QNetworkReply *reply) //当回复结束后
{
//****************ftp********
QTextCodec *codec = QTextCodec::codecForName("utf8");
//使用utf8编码,这样才可以显示中文
QString all = codec->toUnicode(reply->readAll());
ui->lab_ftp->setText(all);
reply->deleteLater(); //最后要释放reply对象
}
7 .在mainwindow.ui文件中添加lable (id为lab_ftp)用于显示下载内容