当前位置:主页 > 软件编程 > C代码 >

QT5编译使用QFtp的方法步骤

时间:2021-06-21 08:45:30 | 栏目:C代码 | 点击:

背景

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

下载

从 GitHub 下载 QFtp:

https://github.com/qt/qtftp

编译

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

放入QT5安装目录中

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

运行示例项目

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会出让程序崩溃,感觉问题出在本地文件已经被清除,还有后续的数据到来,结果就异常了。有时间再来研究,看能不能把协议学透,自己造个轮子出来。

您可能感兴趣的文章:

相关文章