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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос про requestFinished  (Прочитано 4130 раз)
vm-root
Гость
« : Февраль 15, 2009, 17:38 »

Всем привет!

Помогите разобраться.
Вот сигналы и слоты которые я задействовал.
Код
C++ (Qt)
connect(&http, SIGNAL(done(bool)),
   this, SLOT(httpDone(bool)));
connect(&http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
           this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
connect(&http, SIGNAL(requestFinished(int, bool)),
           this, SLOT(httpRequestFinished(int, bool)));
 
В каждом слоте стоит свое сообщение (cerr <<) чтобы было ясно какой этап в данный момент происходит

В httpRequestFinished прописано cerr << "Http request finished" << endl;

Запрос делается один при нажатии кнопки.
http.setHost(str);
httpGetId = http.get("/", &file);
http.close();

Проблема в том, что на один запрос я получаю несколько вызовов слота httpRequestFinished?
Причем если указывать разные адреса сайтов то количество вызовов httpRequestFinished меняется.
Это ошибка или норма?

В каком слоте тогда нужно обрабатывать окончательно полученные данные.
httpDone? или может еще какой. Если использовать httpDone то в него не передается requestId. Те непонятно, какой запрос завершился.

ps. Задача последовательно скачивать заданные .html
С уважением, Владимир.
Записан
ритт
Гость
« Ответ #1 : Февраль 15, 2009, 17:49 »

а параметр int сравнивается с данным httpGetId? код завершения какой?
вроде бы, в примерах всё это неплохо объясняется
Записан
vm-root
Гость
« Ответ #2 : Февраль 15, 2009, 18:29 »

Нет не сравнивается.
Вот посмотрел, что выводит.
httpGetId = 2

requestId = 1
requestId = 2
requestId = 3

Как ошибку посмотреть я не знаю.

Код
C++ (Qt)
void FindDialog::httpRequestFinished(int requestId, bool error) //--requestId идентификатор запроса
{
   QString rId;
   rId = rId.setNum(requestId);
   cerr << "Http request finished" << endl;
   qDebug() << rId;
 
 if(error)
 {
     //Тут ошибки обрабатываем ????
 }
 else
 {
 }
}
 
Записан
Dendy
Гость
« Ответ #3 : Февраль 15, 2009, 19:02 »

Общение с HTTP сервером строится на диалоге запрос-ответ. Даже если полезный запрос у вас один - всё равно будет несколько вспомогательных, просто игнорируйте их:

Код
C++ (Qt)
void FindDialog::httpRequestFinished(int requestId, bool error)
{
 if ( requestId != httpGetId )
   return;
 ...
}

Если в вашем диалоге с сервером всего один запрос - можете его обработать в httpDone(). И не забывайте смотреть произошла ли ошибка.
Записан
FreePascal
Гость
« Ответ #4 : Март 30, 2009, 23:04 »

После запроса моментально вызывается requestFinished(int,bool), второй вызов уже действительно тот что ожидаем.
При создании объекта также вызывается этот сигнал.

Qt 4.5
Может все же баг?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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