Qt、qcore应用与QFtp

Qt、qcore应用与QFtp,qt,signals,slot,qftp,Qt,Signals,Slot,Qftp,我想第一次使用QFtp,并在谷歌上搜索了很多,以了解它应该如何使用。这是一个典型的例子: #include <QCoreApplication> #include <QFtp> #include <QFile> int main(int argc, char ** argv) { QCoreApplication app(argc, argv); QFile *file = new QFile( "C:\\Devel\\THP\\tmp\\test

我想第一次使用QFtp,并在谷歌上搜索了很多,以了解它应该如何使用。这是一个典型的例子:

#include <QCoreApplication>
#include <QFtp>
#include <QFile>

int main(int argc, char ** argv)
{
  QCoreApplication app(argc, argv);

  QFile *file = new QFile( "C:\\Devel\\THP\\tmp\\test.txt" );
  file->open(QIODevice::ReadWrite);

  QFtp *ftp = new QFtp();

  ftp->setTransferMode(QFtp::Active);
  ftp->connectToHost("ftp.trolltech.com"); 
  ftp->login();                           
  ftp->cd("qt");                     
  ftp->get("INSTALL",file);               
  ftp->close();

  QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));

  int ret = app.exec();

  delete ftp;
  delete file;

  return ret;
}
问题是:

据我所知,QCoreApplication应用程序需要处理完成的信号,该信号在ftp get完成时发出。现在,在连接之前调用ftp->get,甚至在所有app.exec上运行app处理程序之前调用


如果文件传输在connect语句之前已经完成,会发生什么情况?事实上,这不会发生,但我可以在ftp->close和connect之间设置一个人工延迟,比如说1分钟。。。。在此期间,ftp get肯定会完成。会发生什么情况?

请注意,QFtp实际上只适用于传统的Qt应用程序,现在建议使用和,如中所述

这就是说,当连接到FTP站点并检索文件后,您的连接呼叫被定位,如果文件首先被下载,那么“退出”信号将永远不会到达。如果在创建QFtp对象后直接进行连接,则这不会成为问题:-

QFtp *ftp = new QFtp();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));
这保证了当QFtp对象发出“完成”信号时,将调用“退出”插槽

QFtp *ftp = new QFtp();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));

ftp->setTransferMode(QFtp::Active);
ftp->connectToHost("ftp.trolltech.com"); 
ftp->login();                           
ftp->cd("qt");                     
ftp->get("INSTALL",file);               
ftp->close();

int ret = app.exec();

但实际上,我希望您示例中的连接在机器有时间协商与另一台服务器的连接之前完成,登录并开始下载文件。

如果ftp在事件循环启动之前完成,则应用程序将不会退出,并且必须终止其进程。QFtp需要运行事件循环才能处理命令。因此,在connect语句出现之前,您可以等待10000年,因为您告诉QFtp要执行的命令在调用app.exec之前不会执行,所以这没有什么区别;请注意,Qt不会在app.exec之前处理信号/插槽;已调用以启动事件循环。@vahancho,是,这就是为什么我建议使用超时为零的QTimer来确保FTP进程在主事件循环启动后发生,还是我在这里遗漏了什么?每一个命令。在事件循环启动之前,QFtp不会执行任何操作。所以延迟QFtp及其命令的创建是不必要的。@thuga,说得好,谢谢你指出这一点。我已经相应地更新了答案。