2010-01-18 91 views
0

你好,我是学习QT,并试图上传使用QFtp文件我写了如下因素代码QT(QFtp)问题

this->connect(this->ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool))); 
this->connect(this->ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(dataTransferProgress(qint64, qint64))); 
this->connect(this->ftp, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int))); 

.....

if(this->file.open(QIODevice::ReadWrite)) 
{ 
    this->ftp->setTransferMode(QFtp::Active); 
    this->ftp->connectToHost(this->settings->getHost()); 
    this->ftp->login(this->settings->getUser(), this->settings->getPassword()); 
    this->ftp->cd(remoteFilePath); 
    this->ftp->get(this->fileName, &this->file); 
    this->ftp->close(); 
} 

和它种停靠它在dataTransferProgress中报告它在0/XXX处,但是从不再次调用该插槽(使用相同的代码,但使用get函数,我可以下载文件并且工作没有问题)也是在超时之后得到的错误是QFtp :: UnknownError。

+0

我有一个非常类似的问题与你的,花很多时间就可以了。这是我学到的最宝贵的东西:你应该习惯Qt风格的编程,即尽可能使事件驱动和面向对象。你会很高兴=) – kolistivra 2010-06-06 23:32:35

回答

2

假设所有命令直到get都成功,那么在get完成之前很可能会关闭连接。当使用该标识符调用commandFinished信号时,应保存由get返回的标识符并呼叫close

注意:除了setTransferMode,您使用的所有方法都是异步的。它们将按照它们被调用的顺序执行,但由于您没有执行任何错误检查,因此可能导致失败,其余的尝试可能会导致一些混淆。

这样做的正确方法是connectToHost第一,如果这是成功的(你可以用commandFinished信号跟踪此)调用login

+0

我同意,你需要建立一个状态引擎,对结果作出反应(commandFinished),然后触发下一个命令。 – e8johan 2010-01-18 14:39:37

+0

我正在做这样的事情: 无效FtpCore :: stateChanged(INT状态) { \t开关(州) \t { \t情况下QFtp ::未连接: \t \t的std ::法院<< “未连接” << std :: endl; \t \t break; \t ..... \t} } 和报告的最终状态是QFtp ::的loggedIn之后,槽 空隙FtpCore :: dataTransferProgress(qint64完成,qint64总) { \t的std :: COUT < Olorin 2010-01-20 13:13:56

+0

我不能完全理解代码,但我认为最初的问题依然存在 - 您在'get'完成之前调用'close'。 – 2010-01-20 13:44:41