Temat: Pobieranie plików - kilku

Cześć, chciałbym pobrać kilka plików. Mam pętlę po naciśnięciu przycisku:
void MainWindow::on_pushButton_2_clicked()
{
QAbstractItemModel *model = ui->TwDocToImport->model();
for(int i=0;i<model->rowCount();i++){
if(model->index(i,0).data(Qt::CheckStateRole).toBool()){
DocumentStruct tmpDoc = DocToImport.at(i);
QString fileName = tmpDoc.sapId+"."+tmpDoc.plikExt;
manager = new QNetworkAccessManager();
reply = manager->get(QNetworkRequest(QUrl("xxxxx"+noFile)));
reply->setProperty("fileName",fileName);
connect(reply,SIGNAL(finished()),SLOT(downloaded()));
}
}
}

i metoda downoladed wygląda:

void MainWindow::downloaded()
{
QString fileName = reply->property("fileName").toString();
QFile file(fileName);
file.open(QIODevice::WriteOnly);
file.write(reply->readAll());
file.close();
}


ale w przypadku pobierania kilku plików w metodzie downloaded mam ciągle tą samą wartość w "fileName" i plik zapisuje się z wielkosścia 0kb :(

konto usunięte

Temat: Pobieranie plików - kilku

Nie podałeś czym jest w twoim kodzie 'reply' i z tego co widzę to sobie je po prostu nadpisujesz w każdym przebiegu pętli, więc (w zależności od kolejności w jakiej pobierania się zakończą) tylko jedno z wywołań MainWindow::downloaded() będzie zawierało poprawny obiekt. Stąd tylko jedna wartość 'fileName' i (jak mniemam) jest to wartość z ostatniego przebiegu pętli.

Zamiast trzymać reply w zmiennej spróbuj podpiąć się do sygnału finished emitowanego z QNetworkAccessManager i w slocie używaj przekazywanego przez niego reply, czyli coś takiego:


//nie zaleca się tworzyć więcej niż jednej instancji na raz, pamiętaj też o jej zwolnieniu gdzieś
manager = new QNetworkAccessManager();
//raz wystarczy
connect(manager,SIGNAL(finished(QNetworkReply *)),SLOT(downloaded(QNetworkReply *)));
...

void MainWindow::on_pushButton_2_clicked()
{
QAbstractItemModel *model = ui->TwDocToImport->model();

for(int i=0;i<model->rowCount();i++){
if(model->index(i,0).data(Qt::CheckStateRole).toBool()){
DocumentStruct tmpDoc = DocToImport.at(i);
QString fileName = tmpDoc.sapId+"."+tmpDoc.plikExt;
QNetworkReply* reply = manager->get(QNetworkRequest(QUrl("xxxxx"+noFile)));
reply->setProperty("fileName", fileName);
}
}
}

void MainWindow::downloaded(QNetworkReply * reply)
{
QString fileName = reply->property("fileName").toString();
QFile file(fileName);
file.open(QIODevice::WriteOnly);
file.write(reply->readAll());
file.close();

reply->deleteLater();
}
Krzysztof Kawa edytował(a) ten post dnia 09.05.12 o godzinie 03:02

Temat: Pobieranie plików - kilku

Super! Domyślałem, się gdzie leży błąd, jednak ciągle mapowałem connect.... w pętli - a trzeba było przed :)

Dzięki za wyczerpującą odpowiedź :)



Wyślij zaproszenie do