Russian Qt Forum

Qt => Работа с сетью => Тема начата: dimky от Март 16, 2018, 16:05



Название: Загрузка нескольких файлов
Отправлено: dimky от Март 16, 2018, 16:05
Приветствую.

Столкнулся с такой проблемой: есть необходимость скачать несколько файлов, пытаюсь реализовать используя пример от QT: https://wiki.qt.io/Download_Data_from_URL/ru

Пример кода:

Код:
void MainWindow::download_pdl_files()
{
    QUrl file_url;

    files_to_download.removeDuplicates();

    for(int x = 0; x < files_to_download.size(); x++)
    {
        ui->sync_status->setText("Downloading file " + files_to_download.at(x) + ".zip");

        file_url.setUrl("http://www.url.com/repo/" + files_to_download.at(x) + ".zip");
        file_data = new FileDownloader(file_url, this);
        file_data->setProperty("file_name", files_to_download.at(x) + ".zip");

        connect(file_data, SIGNAL (downloaded()), this, SLOT (process_file()));

        qDebug() << files_to_download.at(x);
    }
}

void MainWindow::process_file()
{
    QFile file("/pdl_repo/" + file_data->property("file_name").toString());
    file.open(QIODevice::WriteOnly);
    file.write(file_data->downloadedData());
    file.close();

    ui->sync_status->setText("File " + file_data->property("file_name").toString() + " downloaded");
}

В результате выполнения скачивается и сохраняется только файл, который был последний в списке. Такое ощущение будто последняя итерация цикла перезаписывает сигнал/слот. Но ведь объекты, передаваемые в connect то разные? Почему так происходит?


Название: Re: Загрузка нескольких файлов
Отправлено: kambala от Март 16, 2018, 16:14
у тебя переменная file_data соответствует только последнему файлу, т.к. в цикле ты ей каждый раз присваиваешь новое значение. плюс еще и утечка памяти от неудаленных предыдущих file_data.

для решения можно, например, хранить все file_data в массиве или в слоте читать не из file_data, а из sender().


Название: Re: Загрузка нескольких файлов
Отправлено: dimky от Март 16, 2018, 17:00
Да, через sender() работает как надо, благодарю.