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, приложение падает. Как дождаться завершения запроса, а затем обработать ответ в пределах одной функции
2 ответов
вы можете использовать цикл обработки событий:
QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.
также вы должны рассмотреть вопрос о добавлении более короткого таймаута сети (20s?). Я не уверен, что finished вызывается, даже если произошла ошибка. Таким образом, возможно, что вы также подключаетесь к сигналу ошибки.
сначала я рекомендую вам прочитать соответствующую документацию из ссылки на документацию 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