2010-11-18 15 views
4

Ich bin neu in Qt. Ich installierte Qt für VS2008 und integrierte mit meinem VS2010. Ich möchte nur wissen, wie man HTTP-Anfragen macht. Ich habe über QtNetwork gelesen, aber QtHttp ist obselete.HTTP-Anfragen in Qt machen

Ich weiß auch, über Libcurl und curlpp, aber ich habe Probleme, die sie installieren, und macht es mit Qt zu arbeiten.

Was empfehlen Sie, QtNetwork oder curpppp? Wenn QtNetwork, können Sie mir bitte eine Beispielfunktion oder Stück Code (und welche Klasse zu verwenden). Wenn curpp (libcurl), können Sie mich bitte irgendwo zeigen, wo ich die Schritte finden kann, um es für Qt zu installieren (oder bitte erklären)?

Vielen Dank.

Antwort

6

Libcurl und curlpp sind große Bibliotheken, aber sie fügt eine Abhängigkeit zu einem Projekt verwenden, können Sie wahrscheinlich vermeiden.

Neueste Versionen von Qt empfehlen, QNetworkAccessManager zu verwenden, um Netzwerkanforderungen (einschließlich HTTP-Anfragen) zu stellen und Antworten zu erhalten.

Die einfachste Möglichkeit, eine Datei herunterzuladen ist:

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 
manager->get(QNetworkRequest(QUrl("http://stackoverflow.com"))); 

Wenn der replyFinished Schlitz genannt wird, das QNetworkReply Objekt, dass sie als Parameter übernimmt die heruntergeladenen Daten sowie Meta-Daten (Header enthalten, etc.).

Ein vollständigeres Beispiel finden Sie in den Qt-Beispielen, Sie können read here its source code.

5

Giuseppe richtig ist, brauchen Sie nicht Libcurl, curlpp und ähnliche Bibliotheken zu verwenden. Es gibt keine Notwendigkeit dafür, Qt hat eine einfache und funktionierende Klasse für sich.

Beachten Sie, dass die Standardmethode zum Senden von Anfragen und Abrufen von Antworten asynchron ist. Sie müssen immer den Manager fertig (QNetworkReply *) Signal an einen Steckplatz anschließen.

Wenn Sie mehrere Anforderungen senden und für jede Antwort keinen Steckplatz hinzufügen möchten, können Sie immer eine Ereignisschleife ausführen und das Managersignal mit dem Ereignisschleifen quit() verbinden.

Etwas wie folgt aus:

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
QEventLoop *eventLoop = new QEventLoop(); 
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), eventLoop, SLOT(quit()); 

manager->get(QNetworkRequest(QUrl("http://stackoverflow.com"))); 
eventLoop->exec(QEventLoop::ExcludeUserInputEvents); 

QByteArray replyData = reply->readAll(); 
... //do what you want with the data your receive from reply 

Btw. Ich weiß nicht, was du tust. Aber wenn es eine mobile App ist, würde ich Ihnen empfehlen, von VS zu QtCreator IDE zu wechseln. Es hat einen schönen Simulator und eine komplette Toolchain zum Testen von mobilen Geräten.