基于QT的FTP客户端 Qt5.0以后,将QFtp移除了,推荐使用QNetworkAccessManager。
根据官方的建议使用QNetworkAccessManager进行开发,实现Ftp的上传和下载功能,但当先要实现获取文件列表显示时,却发现有些原本QFtp有的功能,QNetworkAccessManager却没有提供,如获取远程FTP服务器列表功能list(),新建文件夹mkdir()等功能。(更多区别请查看QFtp Class Reference与QNetworkAccessManager Class)。
于是,只能自己找资料了,经搜索发现,可以使用QFtp但要自行编译,且QFtp的代码一直在维护。 编译QFtp既然QFtp可以使用,且代码也在维护,便决定自行编译一个。 - 下载QtFtp源码:https://qt.gitorious.org/qt/qtftp
- 将下载到的文件解压(我将其解压到了F:\Project中)
- 进入F:\Project\qt-qtftp\src\qftp打开qftp.pro将文件中CONFIG -= shared修改为CONFIG += shared,使编译能生成动态库。还需要将qftp.h中的#include <QtFtp/qurlinfo.h>修改为#include <qurlinfo.h>,否则会出现:
In file included from qftp.cpp:45:0:qftp.h:47:28: fatal error: QtFtp/qurlinfo.h: No such file or directory
#include <QtFtp/qurlinfo.h> - 在开始菜单打开Qt命令行,cd到F:\Project\qt-qtftp\src\qftp,执行qmake,再执行mingw32-make
- 进入F:\Project\qt-qtftp\lib将生成的*.dll文件复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin目录(我的Qt装在E盘),将*.a和*.pri文件复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\lib目录
- 进入F:\Project\qt-qtftp\src\qftp将qftp.h和qurlinfo.h复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtNetwork目录,并新建无后缀名的文件QFtp(可以新建文本文档,再将后缀去除),在QFtp文件中写入一行代码#include "qftp.h"
用msvc版qt编译补充:
1.修改qftp.pro文件 CONFIG += static CONFIG -= shared
改为 CONFIG += staticlib CONFIG += shared
这样可以生成*.lib文件。 2.用vs编译器nmake时,会出现 这其中qftp.h不能使用#include <qrulinfo.h>,需改用冒号形式#include "qrulinfo.h" 编译完成,可以使用QFtp啦。。。 使用QFtp具体使用请参考:FTP Example或查看下载的源代码F:\Project\qt-qtftp\examples\qftp。 在编译源代码的例子前,需要将ftpwindow.cpp中的#include <QtFtp>改为#include <QFtp>,因为我们上面新建的是名为QFtp无后缀名文件。 修改完后,在Qt命令行cd到F:\Project\qt-qtftp\examples\qftp,执行qmake,再执行mingw32-make,即可完成编译。打开F:\Project\qt-qtftp\examples\qftp\release中的qftp.ext即可查看编译后的效果。 解决文件列表中文乱码问题由于FTP对编码是一无所知的,所以当遇到中文时,就会出现乱码情况。
←_← shenmogui 为解决显示乱码问题,我们需要一个函数: _FromSpecialEncoding(const QString &InputStr) { #ifdef Q_OS_WIN return QString::fromLocal8Bit(InputStr.toLatin1()); #else QTextCodec *codec = QTextCodec::codecForName("gbk"); if (codec) { return codec->toUnicode(InputStr.toLatin1()); } else { return QString(""); } #endif }
并修改例子ftpwindow.cpp文件void FtpWindow::addToList(const QUrlInfo &urlInfo)函数中的代码,将 item->setText(0, urlInfo.name());改为 item->setText(0, _FromSpecialEncoding(urlInfo.name()));就可以显示中文啦↓↓↓ 文件名是正常了,但是下载不了中文名字的文件了。。。←_← 这时就需要另一个函数出场了 _ToSpecialEncoding(const QString &InputStr) { #ifdef Q_OS_WIN return QString::fromLatin1(InputStr.toLocal8Bit()); #else QTextCodec *codec= QTextCodec::codecForName("gbk"); if (codec) { return QString::fromLatin1(codec->fromUnicode(InputStr)); } else { return QString(""); } #endif }
修改例子ftpwindow.cpp文件void FtpWindow::downloadFile()函数中的代码,将 ftp->get(fileList->currentItem()->text(0), file);改为 ftp->get(_ToSpecialEncoding(fileList->currentItem()->text(0)), file);OK!这样就可以显示并下载中文文件名的文件
|