D'abord, je vous recommande de lire la documentation pertinente à partir de la référence de la documentation Qt que vous pouvez trouver ici: http://doc.qt.nokia.com/latest/classes.html. En regardant votre échantillon de code, il semble que vous ayez déjà, avec QNetworkRequest
et QNetworkReply
, un QNetworkAccessManager
. Ce dont vous avez besoin est de connecter un slot au signal finished(QNetworkReply *)
. Ce signal est émis chaque fois qu'une réponse réseau en attente est terminée.
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://api.stackoverflow.com")));
Maintenant, dans votre emplacement, vous pouvez lire les données qui ont été envoyées en réponse à votre demande. Quelque chose comme:
void MyClass::MySlot(QNetworkReply *data) {
QFile file("dataFromRequest");
if (!file.open(QIODevice::WriteOnly))
return;
file.write(data->readAll());
file.close();
}
EDIT:
attendre de manière synchrone pour une utilisation du signal QEventLoop. Vous avez un exemple ici
http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt
Aussi l'autre réponse comprend également mention de QEventLoop, cette réponse était correcte à une fois que. –
havent rencontré toute situation où le slot fini wasent appelé. Je sais que le doc indique qu'il est appelé habituellement mais pour moi il est toujours appelé – chikuba
Cela signifie seulement que vous devriez envisager de vous connecter à certains signaux supplémentaires. Peu importe si "on m'appelle toujours". Il peut y avoir une situation (comme le disent les docs) quand vous n'obtiendrez pas le signal finished(), donc votre boucle d'événement sera bloquée –