Пишу код на основе примера из самого Qt - даунлоадера (в примерах называется http). Он по-умолчанию качает файл по ссылке, которую берет из lineEdit.
Сам код:
void HttpWindow::startRequest(QUrl url)
{
reply = qnam.get(QNetworkRequest(url));
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));
connect(reply, SIGNAL(readyRead()),
this, SLOT(httpReadyRead()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(updateDataReadProgress(qint64,qint64)));
}
void HttpWindow::downloadFile()
{
url = urlLineEdit->text();
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
if (fileName.isEmpty())
fileName = "index.html";
if (QFile::exists(fileName)) {
if (QMessageBox::question(this, tr("HTTP"),
tr("There already exists a file called %1 in "
"the current directory. Overwrite?").arg(fileName),
QMessageBox::Yes|QMessageBox::No, QMessageBox::No)
== QMessageBox::No)
return;
QFile::remove(fileName);
}
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("HTTP"),
tr("Unable to save the file %1: %2.")
.arg(fileName).arg(file->errorString()));
delete file;
file = 0;
return;
}
progressDialog->setWindowTitle(tr("HTTP"));
progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));
downloadButton->setEnabled(false);
// schedule the request
httpRequestAborted = false;
startRequest(url);
}
Как видно из кода - после создания файла он запускат функцию StartRequest, передавая ей в качестве параметра ссылку. В теле этой функции запускается сам реквест и приконнекчиваются слоты и сигналы. Дальше работа идет уже по генерации сигналов, генерируемыми самим реквестом reply.
А мне надо сделать по-другому. У меня есть листбокс и чекабельными элементами, за каждым элементом хранится ссылка на файл. При нажатии кнопки Download нужно скачать все файлы, которые выделены чекбоксами. Собственно вопрос - как это сделать правильно? Уже два дня в голову ничего почему-то не приходит.
В чем трабла - если в обработчике сигнала кликед кнопки сделать простой перебор всех элементов листбокса, и, если он отмечен чекбоксом, запускать нужный алгоритм (из кутешного примера), то получается, что он это делает мгновенно, не давая закончить закачку предыдущего файла. Все виснет. Как сделать так, чтобы он начинал качать следующий элемент (приостанавливал цикл) пока не скачается предыдущий файл?