11

QtWebkitドキュメントの例に従ってサムネイルジェネレータを作成しています。404 not foundまたはなどのエラーページのスクリーンショットは避けたい503 Internal server errorです。

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

4

2 に答える 2

16

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

TCPエラーやHTTP401など、選択できるNetworkErrorは他にもあります。

于 2010-12-02T01:01:26.913 に答える
3

これは私が移植プロジェクトで使用しているものです。返信を確認し、リクエストのバックオフを開始するかどうかを決定します。バックオフ部分は進行中ですが、コメントを残しました。

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;
}
于 2012-12-10T15:17:03.530 に答える