Russian Qt Forum
Ноябрь 22, 2024, 08:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка нескольких файлов  (Прочитано 3577 раз)
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 то разные? Почему так происходит?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 16, 2018, 16:14 »

у тебя переменная file_data соответствует только последнему файлу, т.к. в цикле ты ей каждый раз присваиваешь новое значение. плюс еще и утечка памяти от неудаленных предыдущих file_data.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
dimky
Гость
« Ответ #2 : Март 16, 2018, 17:00 »

Да, через sender() работает как надо, благодарю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.