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

基于QT的FTP客户端

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

于是,只能自己找资料了,经搜索发现,可以使用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 修改为#include ,否则会出现: 
    In file included from qftp.cpp:45:0:qftp.h:47:28: fatal error: QtFtp/qurlinfo.h: No such file or directory
    #include
  4. 在开始菜单打开Qt命令行,cd到F:\Project\qt-qtftp\src\qftp,执行qmake,再执行mingw32-make 
  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文件

CONFIG += static
CONFIG -= shared

改为

CONFIG += staticlib 
CONFIG += shared 

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

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

f:\project\qt\qttftp\src\qftp\qftp.h(47) : fatal error C1083: 无法打开包括文件:
“qurlinfo.h”: No such file or directory

这其中qftp.h不能使用#include ,需改用冒号形式#include "qrulinfo.h"


编译完成,可以使用QFtp啦。。。


使用QFtp

具体使用请参考:FTP Example或查看下载的源代码F:\Project\qt-qtftp\examples\qftp

在编译源代码的例子前,需要将ftpwindow.cpp中的#include 改为#include ,因为我们上面新建的是名为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!这样就可以显示并下载中文文件名的文件咯。。

更多文件名乱码请参考:http://blog.csdn.net/chaijunkun/article/details/6293107

你可能感兴趣的:(Qt)