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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по загрузке страницы  (Прочитано 5768 раз)
bagi
Гость
« : Март 25, 2013, 13:20 »

Здравствуйте, есть функция, которая загружает страницу и дожидается загрузки с помощью
connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(requestFinished(QNetworkReply*)));

Но этот ответ попадает только в функцию requestFinished, там все ок, но мне надо его как-то получить в той функции, где произошел запрос (и где этот самый коннект). как это можно сделать?
Записан
mutineer
Гость
« Ответ #1 : Март 25, 2013, 13:24 »

Код
C++ (Qt)
QNetworkReply * QNetworkAccessManager::get ( const QNetworkRequest & request )
Записан
bagi
Гость
« Ответ #2 : Март 25, 2013, 13:42 »

Я так и делаю
Код
C++ (Qt)
QString MainWindow::DoRequest(QUrl url,QString method,QByteArray post_data)
{
   QNetworkAccessManager *manager = new QNetworkAccessManager;
   QNetworkReply* reply;
   if(method == "GET")
   {
       connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(requestFinished(QNetworkReply*)));
 
       reply = manager->get(QNetworkRequest(url));
 
       QByteArray arr = reply->readAll();
 
       return (QString)arr;
 
   }
   else Beep(100,100);
}
 
void MainWindow::requestFinished(QNetworkReply* reply)
{
   QFile file("C:\\file.htm");
       if (file.open(QIODevice::WriteOnly))
       {
           file.write(reply->readAll());
           file.flush();
           file.close();
       }
}

Но возвращает пустую строку, а в файл C:\\file.htm записывает то, что надо
Записан
RedDog
Гость
« Ответ #3 : Март 25, 2013, 13:44 »

Дык потому что сервер не может моментально ответить, вот первый readAll и не отрабатывает. (а если б отрабатывал, тогда в файл ничего б не писалось).
Записан
bagi
Гость
« Ответ #4 : Март 25, 2013, 13:49 »

Я про то и говорю. Когда оно до конца загружает, вызывается другая функция и туда передается ответ. Но мне надо-то, чтобы в этой функции ответ был доступен
Записан
mutineer
Гость
« Ответ #5 : Март 25, 2013, 14:04 »

Он еще физически от сервера не пришел. Чтобы он был доступен, его надо ждать
Записан
RedDog
Гость
« Ответ #6 : Март 25, 2013, 14:10 »

Но мне надо-то, чтобы в этой функции ответ был доступен
Зачем? В чем принципиальная разница для вас по окончании или в неком промежутке считывать ответ?
Другими словами: что надо получить в 1-м случае и что надо получить во 2-м случае?
Записан
bagi
Гость
« Ответ #7 : Март 25, 2013, 14:14 »

Я говорю про то, что функция должна сделать запрос и возвратить ответ. А как она возвратит ответ, если он в другой функции уже?
Записан
mutineer
Гость
« Ответ #8 : Март 25, 2013, 14:15 »

Значит эта функция должна дождаться из QNetworkReply сигнала finished() и только тогда считывать ответ. Но тогда "другая" функция ответ уже не получит таким способом, как сейчас написано
Записан
bagi
Гость
« Ответ #9 : Март 25, 2013, 14:20 »

Значит эта функция должна дождаться из QNetworkReply сигнала finished() и только тогда считывать ответ. Но тогда "другая" функция ответ уже не получит таким способом, как сейчас написано
Да вторая функция по сути и не нужна. Но что написать между этими строчками?
Код:
 reply = manager->get(QNetworkRequest(url));

QByteArray arr = reply->readAll();
Записан
ConConovaloff
Гость
« Ответ #10 : Март 25, 2013, 14:21 »

Может быть вам подойдет QEventLoop?

Код:
/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();
Записан
RedDog
Гость
« Ответ #11 : Март 25, 2013, 14:21 »

Чем принципиально должен отличаться ответ в DoRequest от requestFinished?
Записан
bagi
Гость
« Ответ #12 : Март 25, 2013, 14:24 »

Чем принципиально должен отличаться ответ в DoRequest от requestFinished?
Ничем, вторая функция не нужна
Записан
bagi
Гость
« Ответ #13 : Март 25, 2013, 14:30 »

Может быть вам подойдет QEventLoop?

Код:
/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();


Да, вот так все работает, спасибо)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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