2010-12-01 18 views

Respuesta

14

Resulta que debe controlar el QNetworkAccessManager asociado con su QWebPage y esperar una señal finished(...). A continuación, puede inspeccionar la respuesta HTTP y verificar su código de estado solicitando el atributo QNetworkRequest::HttpStatusCodeAttribute.

Es mejor explicados en código:

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; 
    } 
} 

Hay más NetworkErrors para elegir, por ejemplo, para errores TCP o HTTP 401.

+5

Fwiw, también se puede consultar el código de estado HTTP directamente con QNetworkReply :: atributo y QNetworkRequest :: HttpStatusCodeAttribute, véase http:. //doc.qt .nokia.com/4.7-snapshot/qnetworkreply.html # attribute. – Macke

+0

Una cosa que quizás no desee es activar esta función para cada activo en una página web que no se carga; por ejemplo, imágenes y JavaScript. Lo ideal es que probablemente solo le importe si la página principal no se carga. –

2

Esto es lo que estoy usando en un proyecto de transferencia. Comprueba la respuesta y decide comenzar a retroceder solicitando o no. La parte de dar marcha atrás está en marcha pero dejó a los comentarios en

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; 
} 
Cuestiones relacionadas