【问题标题】:Override HTTP Error page in QtWebkit覆盖 QtWebkit 中的 HTTP 错误页面
【发布时间】:2014-04-28 18:59:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: qt qtwebkit


    【解决方案1】:

    在代码跳了足够长的时间后,尝试了各种事情,以下似乎至少解决了我的情况:

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

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-27
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 2016-09-25
        • 1970-01-01
        相关资源
        最近更新 更多