2010-12-01 1 views
9

私はan example in the QtWebkit documentationとしてサムネイルジェネレータを書いています。 404 not found503 Internal server errorなどのエラーページのスクリーンショットは避けてください。QtWebkit:HTTPステータスコードをチェックするには?

しかし、QWebPage::loadFinished()シグナルは、ページにHTTPエラーが発生しても常にok = trueで送信されます。 QtWebkitに応答のHTTPステータスコードをチェックする方法はありますか?

答えて

14

あなたのQWebPageに関連付けられたQNetworkAccessManagerを監視し、finished(...)信号を待つ必要があることが分かります。次に、QNetworkRequest::HttpStatusCodeAttribute属性を要求することによって、HTTP応答を検査し、その状態コードを確認することができます。

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

は、例えばから選択するNetworkErrors以上あります

それは良いでしょうが、コードで説明しましたTCPエラーまたはHTTPの場合401

+5

FWIWは、1にもQNetworkReply ::属性とQNetworkRequest :: HttpStatusCodeAttribute、参照httpで直接HTTPステータスコードを照会することができます。//doc.qt .nokia.com/4.7-snapshot/qnetworkreply.html#属性 – Macke

+0

あなたが望ましくないことの1つは、読み込みに失敗したWebページの各アセットに対してこの機能を起動することです。画像やJavaScriptなどがあります。理想的なのは、メインページ自体が読み込まれない場合のみです。 –

2

これは私が移植プロジェクトで使用しているものです。それは応答をチェックし、要求を作ることを止めることを開始することを決定する。バッキングオフの部分が進行中ですが、私はにコメントを残し

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; 
} 
関連する問題