Mein QHttp get () Aufruf funktioniert nicht unter Windows, sondern tut auf Linux
Frage
Ich habe ein Programm geschrieben, das QHttp verwendet, eine Webseite zu erhalten. Dies funktioniert unter Linux, funktioniert aber nicht auf meinem Windows-Rechner (Vista). Es scheint, dass das QHttp Erledigt-Signal nicht empfangen wird.
Der entsprechende Code ist:
Window::Window()
{
http = new QHttp(this);
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
url = new QUrl("http://something.com/status.xml");
http->setHost(url->host(), url->port() != -1 ? url->port() : 80);
if (!url->userName().isEmpty()) http->setUser(url->userName(), url->password());
}
void Window::retrievePage()
{
byteArray = new QByteArray;
result = new QBuffer(byteArray);
result->open(QIODevice::WriteOnly);
httpRequestAborted = false;
httpGetId = http->get(url->path(), result);
}
void Window::httpDone(bool error)
{
//Never gets here!
}
Jede Hilfe wäre appriecated werden.
Matt
Lösung
Das sollte nicht passieren, das heißt QHttp zuverlässig funktioniert sowohl unter Windows und Unix.
Mein Rat ist, zu prüfen, ob die Aufschläge richtige Antwort gibt. Dies kann beispielsweise erfolgen dass die Datenübertragung durch die Überprüfung in Ordnung ist. Sie können den Status von QHttp das Signal verfolgen, z.B. dataReadProgress , requestStarted , QNetworkAccessManager statt? Um Ihre Füße nass schnell, überprüft ein Beispiel, das ich vor einiger Zeit zu Qt Labs geschrieben: Bildbetrachter mit Remote-URL per Drag-and-Drop-Unterstützung . Es nutzt die genannten QNetworkAccessManager das Bild von der fallen gelassen URL zu greifen. Schauen Sie sich die source-code rel="nofollow, es ist nur 150 Zeilen.
Andere Tipps
Umgeschrieben von Ariya vorgeschlagen als QNetworkAccessManager und Blick auf dieses Beispiel zu verwenden,
Das funktioniert jetzt auch unter Windows und Linux.
Window::Window()
{
connect(&manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(retrieveData(QNetworkReply*)));
}
void Window::retrieveMessage()
{
manager.get(QNetworkRequest(QUrl("http://...")));
}
void Window::retrieveData(QNetworkReply *reply)
{
QVariant statusCodeV =
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
// "200 OK" received?
if (statusCodeV.toInt()==200)
{
QByteArray bytes = reply->readAll(); // bytes
}
reply->deleteLater();
}