2010-01-18 133 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