编译和使用QFtp,及中文乱码问题

基于QT的FTP客户端

Qt5.0以后,将QFtp移除了,推荐使用QNetworkAccessManager
根据官方的建议使用QNetworkAccessManager进行开发,实现Ftp的上传和下载功能,但当先要实现获取文件列表显示时,却发现有些原本QFtp有的功能,QNetworkAccessManager却没有提供,如获取远程FTP服务器列表功能list(),新建文件夹mkdir()等功能。(更多区别请查看QFtp Class ReferenceQNetworkAccessManager Class)。
获取FTP服务器列表

于是,只能自己找资料了,经搜索发现,可以使用QFtp但要自行编译,且QFtp的代码一直在维护。

编译QFtp

既然QFtp可以使用,且代码也在维护,便决定自行编译一个。

  1. 下载QtFtp源码:https://qt.gitorious.org/qt/qtftp
  2. 将下载到的文件解压(我将其解压到了F:\Project中)
  3. 进入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>
  4. 在开始菜单打开Qt命令行,cd到F:\Project\qt-qtftp\src\qftp,执行qmake,再执行mingw32-make Qt命令行
  5. 进入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目录
  6. 进入F:\Project\qt-qtftp\src\qftpqftp.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文件

  1. CONFIG += static

  2. CONFIG -= shared

改为

  1. CONFIG += staticlib

  2. CONFIG += shared

这样可以生成*.lib文件。

2.用vs编译器nmake时,会出现

  1. f:\project\qt\qttftp\src\qftp\qftp.h(47) : fatal error C1083: 无法打开包括文件:

  2. “qurlinfo.h”: No such file or directory

这其中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服务器列表

 

解决文件列表中文乱码问题

由于FTP对编码是一无所知的,所以当遇到中文时,就会出现乱码情况。
ftp中文乱码 ←_← shenmogui

为解决显示乱码问题,我们需要一个函数:

  1. _FromSpecialEncoding(const QString &InputStr)

  2. {

  3. #ifdef Q_OS_WIN

  4. return QString::fromLocal8Bit(InputStr.toLatin1());

  5. #else

  6. QTextCodec *codec = QTextCodec::codecForName("gbk");

  7. if (codec)

  8. {

  9. return codec->toUnicode(InputStr.toLatin1());

  10. }

  11. else

  12. {

  13. return QString("");

  14. }

  15. #endif

  16. }

并修改例子ftpwindow.cpp文件void FtpWindow::addToList(const QUrlInfo &urlInfo)函数中的代码,将

item->setText(0, urlInfo.name());

改为

item->setText(0, _FromSpecialEncoding(urlInfo.name()));

就可以显示中文啦↓↓↓

ftp显示中文

文件名是正常了,但是下载不了中文名字的文件了。。。←_←

这时就需要另一个函数出场了

  1. _ToSpecialEncoding(const QString &InputStr)

  2. {

  3. #ifdef Q_OS_WIN

  4. return QString::fromLatin1(InputStr.toLocal8Bit());

  5. #else

  6. QTextCodec *codec= QTextCodec::codecForName("gbk");

  7. if (codec)

  8. {

  9. return QString::fromLatin1(codec->fromUnicode(InputStr));

  10. }

  11. else

  12. {

  13. return QString("");

  14. }

  15. #endif

  16. }

修改例子ftpwindow.cpp文件void FtpWindow::downloadFile()函数中的代码,将

ftp->get(fileList->currentItem()->text(0), file);

改为

ftp->get(_ToSpecialEncoding(fileList->currentItem()->text(0)), file);

OK!这样就可以显示并下载中文文件名的文件

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值