2010-12-01 12 views

Antwort

14

Stellt sich heraus, müssen Sie die QNetworkAccessManager überwachen, die mit Ihrer QWebPage verbunden ist, und auf ein finished(...) Signal warten. Sie können dann die HTTP-Antwort überprüfen und den Statuscode überprüfen, indem Sie nach dem Attribut QNetworkRequest::HttpStatusCodeAttribute fragen.

Es ist besser erklärt in Code:

void MyClass::initWebPage() 
{ 
    myQWebPage = new QWebPage(this); 
    connect(
    myQWebPage->networkAccessManager(), SIGNAL(finished(QNetworkReply *)), 
    this, SLOT(httpResponseFinished(QNetworkReply *)) 
); 
} 

void MyClass::httpResponseFinished(QNetworkReply * reply) 
{ 
    switch (reply->error()) 
    { 
    case QNetworkReply::NoError: 
     // No error 
     return; 
    case QNetworkReply::ContentNotFoundError: 
     // 404 Not found 
     failedUrl = reply->request.url(); 
     httpStatus = reply->attribute(
     QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     httpStatusMessage = reply->attribute(
     QNetworkRequest::HttpReasonPhraseAttribute).toByteArray(); 
     break; 
    } 
} 

Es gibt mehr NetworkErrors zur Auswahl, zum Beispiel für TCP-Fehler oder HTTP 401.

+5

FWIW, man kann auch den HTTP-Statuscode direkt mit QNetworkReply :: Attribut und QNetworkRequest abfragen :: HttpStatusCodeAttribute finden Sie unter http:. //doc.qt .nokia.com/4.7-snapshot/qnetworkreply.html # Attribut. – Macke

+0

Eine Sache, die Sie nicht möchten, ist diese Funktion für jedes Asset auf einer Webseite auszulösen, die nicht geladen werden kann; zum Beispiel Bilder und JavaScript. Idealerweise interessiert es Sie wahrscheinlich nur, wenn die Hauptseite selbst nicht geladen wird. –

2

Dies ist, was ich in einem Portierungsprojekt verwende. Er prüft die Antwort und beschließt, die Anfrage zurückzunehmen oder nicht. Der Träger aus Teil ist im Gange, aber ich ließ die Kommentare in

QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); 
Q_CHECK_PTR(reply); 

QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); 
if (!statusCode.isNull() && statusCode.toInt() >= 400){ 
    //INVALID_SERVER_RESPONSE_BACKOFF; 
    qDebug() << "server returned invalid response." << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
    return; 
}else if (!statusCode.isNull() && statusCode.toInt() != 200){ 
    //INVALID_SERVER_RESPONSE_NOBACKOFF; 
    qDebug() << "server returned invalid response." << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
    return; 
}