QNetworkReply esperar para terminar
-
14-11-2019 - |
Pergunta
Eu estou usando o Qt 4.6.3 e as seguintes não-código de trabalho
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;
como esta função devolve um vazio QStringList, o aplicativo falha.Como esperar até que a solicitação foi concluída e, em seguida, processar a resposta dentro de uma função
Solução
Você pode usar o loop de eventos:
QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.
Além disso, você deve considerar a adição de alguns mais curtos de tempo limite de rede (20?).Eu não tenho certeza se terminou é chamado, mesmo se ocorreu um erro.Assim, é possível, que você tem de ligar para o sinal de erro também.
Outras dicas
Primeiro eu recomendo que você leia a documentação do Qt Documentação de Referência que você pode encontrar aqui: http://doc.qt.nokia.com/latest/classes.html.
Olhando para o seu exemplo de código, parece que você já tem, lado a lado com QNetworkRequest
e QNetworkReply
, um QNetworkAccessManager
.O que você precisa é conectar um slot para o finished(QNetworkReply *)
sinal.Este sinal é emitido sempre que um pendente de rede de resposta é terminado.
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://api.stackoverflow.com")));
Agora, em seu slot, você pode ler os dados que foi enviada em resposta à sua solicitação.Algo como:
void MyClass::MySlot(QNetworkReply *data) {
QFile file("dataFromRequest");
if (!file.open(QIODevice::WriteOnly))
return;
file.write(data->readAll());
file.close();
}
EDITAR:
Aguardar de forma síncrona para um sinal de usar QEventLoop.Você tem um exemplo aqui
http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt