2011-03-30 2 views
11

J'utilise Qt 4.6.3 et le code suivant sans travailQNetworkReply attendent terminé

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; 

que cette fonction retourne un QStringList vide, les application se bloque. Comment attendre jusqu'à ce que la demande ait fini et traiter ensuite la réponse au sein d'une fonction

Répondre

33

Vous pouvez utiliser la boucle d'événement: (20 ans)

QEventLoop loop; 
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit())); 
loop.exec(); 
// here you have done. 

Aussi, vous devriez envisager d'ajouter un peu plus court alors délai d'attente du réseau. Je ne suis pas sûr si fini est appelé même si une erreur s'est produite. Il est donc possible que vous vous connectiez également au signal d'erreur.

+0

Aussi l'autre réponse comprend également mention de QEventLoop, cette réponse était correcte à une fois que. –

+1

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

+0

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 –

5

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

+0

Je sais aussi cela, mais comment serais-je en mesure de retourner les données reçues dans la même fonction (je ne veux pas avoir une fonction supplémentaire) – yolo

Questions connexes