覆盖QtWebkit中的HTTP错误页面

Pas*_*cal 6 qt qtwebkit

我想在一个显示错误页面QWebView.例如,如果服务器返回404错误,QWebView则应显示其自己的自定义404错误,而不是从服务器发送的错误.

我使用它QWebPage::extension来处理错误条件,它适用于网络错误.但是,如果服务器返回错误404并同时返回错误页面,则会显示此页面,并且QWebPage::extension永远不会调用该方法.

有没有办法强制QtWebKit调用错误处理程序并覆盖服务器错误页面?

小智 2

需要注意的是,如果您替换 handleNetworkFinished() 插槽中的 mainFrame 内容,并且页面元素(例如外部图像或脚本)发生网络错误,您可能会看到错误页面而不是加载的页面。

另一种选择是重新实现 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);
}
Run Code Online (Sandbox Code Playgroud)