LinuxForum.Fans
Тема

Как скачать файл из проекта на Qt

Автор: XRevan86 46 сообщений 12210 просмотров
#117430

Совершенно верно, я уже плохо помню терминологию.
Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?

Пётр.

#117977
Peter написал:
Совершенно верно, я уже плохо помню терминологию.
Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?

Пётр.

По скольку, как я понял, пишеться самодостаточный класс. То лучше будет добавить сигнал. Котрый будет издаваться по звершению закачки файла. И соеденить этот сигнал со слотом для выхода.

#118173
voral написал:
[quote=Peter]Совершенно верно, я уже плохо помню терминологию.
Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?

Пётр.

По скольку, как я понял, пишеться самодостаточный класс. То лучше будет добавить сигнал. Котрый будет издаваться по звершению закачки файла. И соеденить этот сигнал со слотом для выхода.[/quote]
Согласен, это будет правильнее, но нужно ли это вобще?
Ведь после окончания Download.Initial из него и так произойдёт выход, дальше
можно будет или выйти или что-то делать с файлом.

Пётр.

#118203
Peter написал:

Ведь после окончания Download.Initial из него и так произойдёт выход, дальше
можно будет или выйти или что-то делать с файлом.

Только на момент выхода из Inital файл еще не скачан

#118339

Вообще, не в обиду этому форуму, есть отличный Russian Qt Forum smile

#119283

На днях была необходимость написать нечто подобное. Т.е. нужно было дождаться скачивания и только потом грохаться. Сделал следующим образом.
во первых было добавлено в сам класс следующее:

text

...
private:
    void stopTimer(); //остановка таймера
    int timerId;  // Это id таймера. Таймер используем для реализации timeouta чтоб у нас навечно объект не повис
    bool fCanExit; //Это флаг возможности выхода. В конструкторе приравниваем к  true
    QEventLoop loop; //для реализации цикла обработки событий
protected:
    void timerEvent(QTimerEvent *event); //переопределяем процедуру обработки события таймера

После отправки запроса get или post

text

....
    this->timerId = this->startTimer(10000); //Запускаем таймер который будет обереать нас от бесконечного ожидания ответа
    if (!this->loop.isRunning()) this->loop.exec(); //если наш цикл обработки еще не запущен то запускаем
                                                                          //возможно в этом вам нет необходимости. у меня есть возможность (некоторая специфика)
                                                                          // повторного захода в этот запрос. 
...

Обработка события таймера

text

void VWebApi::timerEvent(QTimerEvent */* event */)
{
    this->stopTimer(); //останавливаем таймер. т.к. таймаут истек и нам уже он не нужен
    this->loop.exit(); //останавливем процесс обработки сообщений. Как только это произойдет мы выйдем 
                                // из метода отправляющего запрос (у вас Initial) и перейдем к следующей строке кода. Т.е. в вашем случае
                               // return 0 (main.cpp);
}

Процедура остановки таймера. Возможно это тоже можно вам не использовать. Это моя специфика: если отправляется повторный запрос мне надо перезапускать таймер

text

void VWebApi::stopTimer()
{
    this->killTimer(this->timerId);
    this->timerId=0;
}

Обработка сигнала окончания приема

text

void VWebApi::replyFinished(QNetworkReply* reply, replyType rplType)
{
...
   this->stopTimer(); // останавливаем таймер, чтобы у нас не грохнулся объект во время обработки
   fCanExit = // тут решаем можно уже выходить или нет
   if (this->fCanExit) this->loop.exit(); если можно то останавливаем обработку событий...
...
}

VWebApi - это имя моего класса, соответственно меняйте на свое :)
Т.к. дернул со своего проекта с некоторой спецификой, так что может быть вам что то можно тут и "почистить"

Войдите или зарегистрируйтесь, чтобы ответить.