QNetworkReply ждет завершения
Я использую Qt 4.6.3 и следующий нерабочий код
QStringList userInfo;
QNetworkRequest netRequest(QUrl("http://api.stackoverflow.com/1.1/users/587532"));
QNetworkReply *netReply = netman->get(netRequest);
// from here onwards not working
netReply->waitForReadyRead(-1);
if (netReply->isFinished()==true)
{userInfo << do sth to reply;}
return userInfo;
когда эта функция возвращает пустой QStringList, приложение аварийно завершает работу. Как подождать, пока запрос завершится, а затем обработайте ответ внутри одной функции
Ответы
Ответ 1
Вы можете использовать цикл событий:
QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.
Также следует подумать о том, чтобы добавить более короткий тайм-аут сети (20 секунд?). Я не уверен, что если вызывается, даже если произошла ошибка. Таким образом, возможно, что вы также подключаетесь к сигналу ошибки.
Ответ 2
Сначала я рекомендую вам ознакомиться с соответствующей документацией из Справочника по документации Qt, которую вы можете найти здесь: http://doc.qt.nokia.com/latest/classes.html.
Посмотрев на образец кода, кажется, что у вас уже есть вместе с QNetworkRequest
и QNetworkReply
, a QNetworkAccessManager
. Вам нужно подключить слот к сигналу finished(QNetworkReply *)
. Этот сигнал выдается всякий раз, когда завершается ожидающий ответ сети.
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://api.stackoverflow.com")));
Теперь в вашем слоте вы можете прочитать данные, которые были отправлены в ответ на ваш запрос. Что-то вроде:
void MyClass::MySlot(QNetworkReply *data) {
QFile file("dataFromRequest");
if (!file.open(QIODevice::WriteOnly))
return;
file.write(data->readAll());
file.close();
}
EDIT:
Для ожидания синхронно для сигнала используйте QEventLoop. У вас есть пример здесь
http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt