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