Подтвердить что ты не робот

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, приложение аварийно завершает работу. Как подождать, пока запрос завершится, а затем обработайте ответ внутри одной функции

4b9b3361

Ответ 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