2012-02-14 13 views
6

QWebViewにエラーページを表示したいと思います。たとえば、サーバーが404エラーを返した場合、QWebViewは、サーバから送信されたメッセージの代わりに独自のカスタム404エラーを表示する必要があります。QtWebkitのHTTPエラーページを無効にする

私はQWebPage::extensionを使用してエラー状態を処理し、ネットワークエラーでうまく動作します。 しかし、サーバがエラー404を返すと同時に、エラーページを返した場合、このページが表示され、QWebPage::extensionメソッドは呼び出されません。

強制的にQtWebKitがエラーハンドラを呼び出し、サーバーのエラーページを上書きする方法はありますか?

答えて

2

つのノートをあなたのページ要素(外部イメージやスクリプトなど)でネットワークエラーが発生した場合は、読み込まれたページの代わりにエラーページを表示します。

QWebPage :: extension()とQWebPage :: supportsExtension()を再実装するオプションもあります。この場合、QT Webkitは、ページエラーのためにextension()の実装を呼び出し、指定したページに置き換えます次のようになります。

class WebPage : public QWebPage 
{ 
    Q_OBJECT 
public: 
    WebPage(QObject *parent = 0); 
    bool extension(Extension extension, 
       const ExtensionOption *option, 
       ExtensionReturn * output); 
    bool supportsExtension(Extension extension) const; 
}; 

bool WebPage::extension(Extension extension, 
         const ExtensionOption *option, 
         ExtensionReturn * output) 
{ 
    if(!option || !output) { 
     return false; 
    } 
    if(extension == QWebPage::ErrorPageExtension) { 
    const ErrorPageExtensionOption *errOption = 
      static_cast<const ErrorPageExtensionOption*>(option); 
    QString errPage; 
    errPage = "<html><body><h1>"; 
    errPage += "Page loading error, URL: "; 
    errPage += errOption->url.toString(); 
    errPage += "</h1><h3>Error occurred in the "; 
    switch (errOption->domain) { 
     case QWebPage::QtNetwork: 
     errPage += "QT network layer, code is: "; 
     break; 
     case QWebPage::Http: 
     errPage += "HTTP layer, HTTP error code is: "; 
     break; 
     case QWebPage::WebKit: 
     errPage += "WebKit internals, error code is: "; 
     break; 
     default: 
     errPage += "Unknown domain, error code is: "; 
    } 
    errPage += errOption->error; 
    errPage += "</h3><h4><br>Error text: "; 
    errPage += errOption->errorString; 
    errPage += "</h4></body></html>"; 
    ErrorPageExtensionReturn *errReturn = 
           static_cast<ErrorPageExtensionReturn*>(output); 
    errReturn->baseUrl = errOption->url; 
    errReturn->content = errPage.toUtf8(); 
    // errReturn->contentType = "text/html" 
    // errReturn->encoding = "UTF-8"; // these values are defaults 
    return true; 
    } 
    return false; 
} 

bool WebPage::supportsExtension(Extension extension) const 
{ 
    if(extension == QWebPage::ErrorPageExtension) { 
    return true; 
    } 
    return QWebPage::supportsExtension(extension); 
} 
4

様々な事をしようと、十分な長さのコードの周りにホッピングした後、次は、少なくとも私の場合解決するようです:あなたが見ることがあります)(handleNetworkFinishedにスロットをメインフレームのコンテンツを置き換える場合は、

MyWebPageSubclass::MyWebPageSubclass(...) { 
    connect(networkAccessManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(handleNetworkFinished(QNetworkReply*))); 
    // ... 
} 

void MyWebPageSubclass::handleNetworkFinished(QNetworkReply *reply) { 
    bool ok = false; 
    int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(&ok); 

    if (ok && httpStatus/100 != 1 && httpStatus/100 != 2 && httpStatus/100 != 3) { 
     if (!supportsExtension(ErrorPageExtension)) { 
      return; 
     } 

     ErrorPageExtensionOption option; 
     option.domain = Http; 
     option.error = httpStatus; 
     option.url = reply->url(); 
     option.errorString = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
     ErrorPageExtensionReturn output; 
     if (!extension(ErrorPageExtension, &option, &output)) { 
      return; 
     } 

     mainFrame()->setContent(output.content, output.contentType, output.baseUrl); 
    } 
} 
+0

ありがとうございました。これは本当に私の問題を解決します。 – Pascal

関連する問題