这是一个C++ GUI QT4编程中的ftp例子,它实现了从ftp下载一个文件的功能。我在使用这个例子的时候出现了一个匪夷所思的问题。当我在main函数中调用getFile()时,可以正确下载到文件。但是当我在MainWindow中调用getFile()时却不行,根本就没有连接上ftp。请问如何解释这个问题?会不会是构造函数中 : QObject(parent)的问题?
ftpget的源代码附上。
ftpget.h
#ifndef FTPGET_H
#define FTPGET_H
#include <QFile>
#include <QFtp>
class QUrl;
class FtpGet : public QObject
{
Q_OBJECT
public:
FtpGet(QObject *parent = 0);
bool getFile(const QUrl &url);
signals:
void done();
private slots:
void ftpDone(bool error);
private:
QFtp ftp;
QFile file;
};
#endif
#include <QtCore>
#include <QtNetwork>
#include <iostream>
#include "ftpget.h"
FtpGet::FtpGet(QObject *parent)
: QObject(parent)
{
connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
}
bool FtpGet::getFile(const QUrl &url)
{
QString localFileName = QFileInfo(url.path()).fileName();
if (localFileName.isEmpty())
localFileName = "ftpget.out";
file.setFileName(localFileName);
if (!file.open(QIODevice::WriteOnly)) {
std::cerr << "Error: Cannot write file "
<< qPrintable(file.fileName()) << ": "
<< qPrintable(file.errorString()) << std::endl;
return false;
}
ftp.connectToHost(url.host(), url.port(21));
ftp.login();
ftp.get(url.path(), &file);
ftp.close();
return true;
}
void FtpGet::ftpDone(bool error)
{
if (error) {
std::cerr << "Error: " << qPrintable(ftp.errorString())
<< std::endl;
} else {
std::cerr << "File downloaded as "
<< qPrintable(file.fileName()) << std::endl;
}
file.close();
emit done();
}
------解决方案--------------------
QFtp 的很多方法 都是非阻塞的,你这样的使用 可能会出现文件还没有下载到就关闭FTP 的情况。
------解决方案--------------------
兄弟,你MainWindow中是在使用局部变量来下载!
函数结束FtpGet就析构了。哪还能下载得下来呢?new一个 FtpGet 就可以了。
void MainWindow::on_Z_D_action_triggered()
{
FtpGet getter;
getter.getFile(QUrl("ftp://21.179.232.60/home/wj/Projects/Restruction/xuzhaohe/D3100/caliberation_result.txt"));
}