Russian Qt Forum

Qt => Работа с сетью => Тема начата: bagi от Март 25, 2013, 13:20



Название: Вопрос по загрузке страницы
Отправлено: bagi от Март 25, 2013, 13:20
Здравствуйте, есть функция, которая загружает страницу и дожидается загрузки с помощью
connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(requestFinished(QNetworkReply*)));

Но этот ответ попадает только в функцию requestFinished, там все ок, но мне надо его как-то получить в той функции, где произошел запрос (и где этот самый коннект). как это можно сделать?


Название: Re: Вопрос по загрузке страницы
Отправлено: mutineer от Март 25, 2013, 13:24
Код
C++ (Qt)
QNetworkReply * QNetworkAccessManager::get ( const QNetworkRequest & request )


Название: Re: Вопрос по загрузке страницы
Отправлено: bagi от Март 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 записывает то, что надо


Название: Re: Вопрос по загрузке страницы
Отправлено: RedDog от Март 25, 2013, 13:44
Дык потому что сервер не может моментально ответить, вот первый readAll и не отрабатывает. (а если б отрабатывал, тогда в файл ничего б не писалось).


Название: Re: Вопрос по загрузке страницы
Отправлено: bagi от Март 25, 2013, 13:49
Я про то и говорю. Когда оно до конца загружает, вызывается другая функция и туда передается ответ. Но мне надо-то, чтобы в этой функции ответ был доступен


Название: Re: Вопрос по загрузке страницы
Отправлено: mutineer от Март 25, 2013, 14:04
Он еще физически от сервера не пришел. Чтобы он был доступен, его надо ждать


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


Название: Re: Вопрос по загрузке страницы
Отправлено: bagi от Март 25, 2013, 14:14
Я говорю про то, что функция должна сделать запрос и возвратить ответ. А как она возвратит ответ, если он в другой функции уже?


Название: Re: Вопрос по загрузке страницы
Отправлено: mutineer от Март 25, 2013, 14:15
Значит эта функция должна дождаться из QNetworkReply сигнала finished() и только тогда считывать ответ. Но тогда "другая" функция ответ уже не получит таким способом, как сейчас написано


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

QByteArray arr = reply->readAll();


Название: Re: Вопрос по загрузке страницы
Отправлено: ConConovaloff от Март 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();


Название: Re: Вопрос по загрузке страницы
Отправлено: RedDog от Март 25, 2013, 14:21
Чем принципиально должен отличаться ответ в DoRequest от requestFinished?


Название: Re: Вопрос по загрузке страницы
Отправлено: bagi от Март 25, 2013, 14:24
Чем принципиально должен отличаться ответ в DoRequest от requestFinished?
Ничем, вторая функция не нужна


Название: Re: Вопрос по загрузке страницы
Отправлено: bagi от Март 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();


Да, вот так все работает, спасибо)