QT5编译使用QFtp的方法步骤

 更新时间:2021年02月03日 14:07:17   作者:zhoutk  
这篇文章主要介绍了QT5编译使用QFtp的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

背景

使用 QNetworkAccessManager 可以实现 Ftp 的上传/下载功能,但它没有提供例如list、cd、remove、mkdir、rmdir、rename 等功能。这种情况下,我们可以使用QFtp,需要下载源码、编译并处理一些坑。

下载

从 GitHub 下载 QFtp:

https://github.com/qt/qtftp

编译

  • 修改 qftp/qftp.pro,删除最后一行,module_qtftp_tests。不然编译会有错误,这个是测试子项目,暂时去除,先编译使用。
  • 修改 qftp/src/qftp/qftp.h 第47行 #include <QtFtp/qurlinfo.h> => #include <qurlinfo.h>
  • 修改 qftp/src/qftp/qftp.pro 第4,5行的+,-号互换,生成*.dll
  • 修改第4行为 CONFIG += staticlib,生成.lib和.prl

用qtcreator打开qftp/qftp.pro,编译生成库文件。

放入QT5安装目录中

我以Qt5.5.1为例说明,其它版本类似

  • 将 Qt5Ftpd.lib、Qt5Ftp.lib、Qt5Ftpd.prl、Qt5Ftp.prl 拷贝至 D:\Qt\Qt5.5.1\5.5\msvc2010\lib。
  • 将Qt5Ftpd.dll、Qt5Ftp.dll 拷贝至D:\Qt\Qt5.5.1\5.5\msvc2010\bin。
  • 将qftp.h、qurlinfo.h 拷贝至 D:\Qt\Qt5.5.1\5.5\msvc2010\include\QtNetwork,并新建一个名为 QFtp 的文件(没有后缀名),然后用本写入 #include "qftp.h"。

运行示例项目

  • 作为qftp/qftp.pro 项目的子项目,直接编译examples项目,只需要更改qftp\examples\qftp\ftpwindow.cpp中的43行,将#include <QtFtp>改为#include <QFtp>,即可以编译并运行。
  • 作为独立项目,除了修改1中的这项,还需要修改qftp\examples\qftp\qftp.pro中ftp库的加载方式,从第五行中删除ftp,然后增加如下代码:
CONFIG(debug, debug|release) {
  LIBS += -lQt5Ftpd
} else {
  LIBS += -lQt5Ftp
}

也就是说,ftp的加载方式还不能与Qt5的原生库完全一致,如何做到这一点,我还需要时间研究。

示例项目改进

修正进度条的提前显示,对progressDialog新对象进行如下设置,去掉了取消操作,取消操作有问题,暂时屏蔽。

 progressDialog = new QProgressDialog("download...", nullptr, 0, 100, this);
 progressDialog->setWindowModality(Qt::WindowModal);
 auto winFlags = windowFlags() & ~Qt::WindowMinMaxButtonsHint;
 progressDialog->setWindowFlags(winFlags &~ Qt::WindowCloseButtonHint); //去掉窗口的默认按钮
 progressDialog->reset();          //避免提前显示
 progressDialog->setAutoClose(false);
 progressDialog->setAutoReset(false);

屏蔽取消按钮的消息链接。

//connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));

支持多文件下载
首先,在QTreeWidget生成后,设置其可以选中多行。

fileList->setSelectionMode(QAbstractItemView::ExtendedSelection);

修改downloadFile函数,支持多文件下载。

QList<QTreeWidgetItem*> selectedItemList = fileList->selectedItems();
for (int i = 0; i < selectedItemList.size(); i++)
 {
  QString fileName = selectedItemList[i]->text(0);
  if (QFile::exists(fileName)) {
    QMessageBox::information(this, tr("FTP"),
    tr("There already exists a file called %1 in the current directory.").arg(fileName));
    return;
  }
  file = new QFile(fileName);
  if (!file->open(QIODevice::WriteOnly)) {
    QMessageBox::information(this, tr("FTP"),
    tr("Unable to save the file %1: %2.").arg(fileName).arg(file->errorString()));
    delete file;
    return;
  }
  ftp->get(fileName, file);
  progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
  downloadButton->setEnabled(false);
  progressDialog->exec();
}

项目地址
https://github.com/zhoutk/qtDemo

命令行编译

git clone https://github.com/zhoutk/qtDemo
cd qtDemo/qftp & mkdir build & cd build
cmake ..
cmake --build .   

编译时注意:cmake默认为x86架构,需要与你安装的Qt版本对应;编译好了,运行前,请注意目录结构是否正确。

小结

上面是正统方法在qt5中使用qftp,还可以直接把其源代码纳入你的应用项目中,因为一共只有四个文件,稍作修改就可以使用。我发现该项目的问题,主要是cancelDownload会出让程序崩溃,感觉问题出在本地文件已经被清除,还有后续的数据到来,结果就异常了。有时间再来研究,看能不能把协议学透,自己造个轮子出来。

到此这篇关于QT5编译使用QFtp的方法步骤的文章就介绍到这了,更多相关QT5编译使用QFtp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 指向类成员的指针

    C++ 指向类成员的指针

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)
    2020-03-03
  • 关于C++11的统一初始化语法示例详解

    关于C++11的统一初始化语法示例详解

    C++之前的初始化语法很乱,有四种初始化方式,而且每种之前甚至不能相互转换,但从C++11出现后就好了,所以这篇文章主要给大家介绍了关于C++11的统一初始化语法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • 一篇文章带你了解C++(STL基础、Vector)

    一篇文章带你了解C++(STL基础、Vector)

    这篇文章主要为大家详细介绍了C++ STL基础,vector向量容器使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • C++实现简单通讯录管理系统

    C++实现简单通讯录管理系统

    这篇文章主要为大家详细介绍了C++实现简单通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法

    关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法

    这篇文章主要介绍了关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法,本文给大家介绍的非常详细,对大家的学习工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 关于C++继承你可能会忽视的点

    关于C++继承你可能会忽视的点

    继承是面向对象三大特性之一,有些类与类之间存在特殊的关系,下面这篇文章主要给大家介绍了关于C++继承你可能会忽视的点,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 解决gcc编译报错unknown type name ‘bool‘问题

    解决gcc编译报错unknown type name ‘bool‘问题

    这篇文章主要介绍了解决gcc编译报错unknown type name ‘bool‘问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C++使用map容器实现电子词典

    C++使用map容器实现电子词典

    这篇文章主要为大家详细介绍了C++如何使用map容器实现电子词典功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2022-11-11
  • 详解C++纯虚函数与抽象类

    详解C++纯虚函数与抽象类

    这篇文章主要介绍了C++纯虚函数与抽象类的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    如何通过wrap malloc定位C/C++的内存泄漏问题

    用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰。本文提供一种通过wrap malloc查找memory leak的思路。
    2021-05-05

最新评论