Dobra, sam powinienem doczytać dokumentację.
- Wszystkie, operacje na QFtp są asynchroniczne. Wywołując metodę dla danej operacji jedynie jest ona dodawana do kolejki operacji do zrobienia (zwracany jest identyfikator zlecenia, a nie błąd).
- postęp wykonania jest sygnalizowany przez sygnały
- jeśli jakaś operacja się nie powiedzie, wszystkie następne zlecenia operacji są anulowane (kolejka jest czyszczona).
- poniższy kod działa (testowałem):
void MainWindow::on_pushButton_clicked()
{
QFtp *ftp=new QFtp(this);
QFile *file=new QFile("INSTALL-ftp.txt", ftp);
file->open(QIODevice::WriteOnly | QIODevice::Text);
connect(ftp, SIGNAL(commandStarted(int)),
this, SLOT(printStarted(int)));
connect(ftp, SIGNAL(commandFinished(int,bool)),
this, SLOT(printFinished(int,bool)));
connect(ftp, SIGNAL(stateChanged(int)),
this, SLOT(printStatus(int)));
connect(ftp, SIGNAL(done(bool)),
ftp, SLOT(deleteLater()));
ftp->connectToHost("ftp.trolltech.com", 21);
ftp->login();
ftp->cd("qt");
ftp->get("INSTALL", file);
ftp->close();
}
void MainWindow::printStarted(int id)
{
ui->textEdit->append(QString("started %1").arg(id));
}
void MainWindow::printFinished(int id, bool error)
{
QFtp *ftp = qobject_cast<QFtp*>(sender());
if (error) {
ui->textEdit->append(QString("Failed %1, error %2").arg(id).arg(ftp->error()));
} else {
ui->textEdit->append(QString("Success %1").arg(id));
}
}
void MainWindow::printStatus(int status)
{
static const char* const states[] = {
"Unconnected",
"HostLookup",
"Connecting",
"Connected",
"LoggedIn",
"Closing",
" --- uknown --- "
};
ui->textEdit->append(states[qBound(0,status,6)]);
}
Postępy ściągania widać w edytorze, który sobie dodałem i po wykonaniu wszystkich operacji widzę w nim:
started 1
HostLookup
Connecting
Connected
Success 1
started 2
LoggedIn
Success 2
started 3
Success 3
started 4
Success 4
started 5
Closing
Unconnected
Success 5