Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖QtWebkit中的HTTP错误页_Qt_Qtwebkit - Fatal编程技术网

覆盖QtWebkit中的HTTP错误页

覆盖QtWebkit中的HTTP错误页,qt,qtwebkit,Qt,Qtwebkit,我想在QWebView中显示一个错误页面。例如,如果服务器返回404错误,QWebView应显示其自己的自定义404错误,而不是从服务器发送的错误 我使用QWebPage::extension来处理错误条件,它可以很好地处理网络错误。 但是,如果服务器返回一个错误404,同时返回一个错误页面,则会显示该页面,并且永远不会调用QWebPage::extension方法 有没有办法强制QtWebKit调用错误处理程序并覆盖服务器错误页面?在代码周围跳了足够长的时间后,尝试了各种方法,下面似乎至少解决

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

我使用
QWebPage::extension
来处理错误条件,它可以很好地处理网络错误。 但是,如果服务器返回一个错误404,同时返回一个错误页面,则会显示该页面,并且永远不会调用
QWebPage::extension
方法


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

在代码周围跳了足够长的时间后,尝试了各种方法,下面似乎至少解决了我的问题:

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

请注意,如果在handleNetworkFinished()插槽中替换大型机内容,则在页面元素(如外部图像或脚本)出现网络错误时,您可能会看到错误页面,而不是加载的页面

另一个选项是重新实现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);
}
类网页:公共QWeb网页
{
Q_对象
公众:
网页(QObject*parent=0);
bool扩展(扩展、,
const ExtensionOption*选项,
扩展返回*输出);
bool支架张力(延伸)常数;
};
bool网页::扩展(扩展,
const ExtensionOption*选项,
ExtensionReturn*输出)
{
如果(!选项| |!输出){
返回false;
}
if(扩展==QWebPage::ErrorPageExtension){
常量错误页面扩展选项*错误选项=
静态(可选);
QString-errPage;
errPage=“”;
errPage+=“页面加载错误,URL:”;
errPage+=errOption->url.toString();
errPage+=“中出现错误”;
交换机(选项->域){
案例QWeb页面::QT网络:
errPage+=“QT网络层,代码为:”;
打破
案例QWebPage::Http:
errPage+=“HTTP层,HTTP错误代码为:”;
打破
案例QWebPage::WebKit:
errPage+=“WebKit内部,错误代码为:”;
打破
违约:
errPage+=“未知域,错误代码为:”;
}
errPage+=errOption->error;
errPage+=“
错误文本:”; errPage+=errOption->errorString; errPage+=“”; ErrorPageExtensionReturn*errReturn= 静态_-cast(输出); errReturn->baseUrl=errOption->url; errReturn->content=errPage.toUtf8(); //errReturn->contentType=“text/html” //errReturn->encoding=“UTF-8”;//这些值是默认值 返回true; } 返回false; } bool网页::supportsExtension(扩展)const { if(扩展==QWebPage::ErrorPageExtension){ 返回true; } 返回QWebPage::supportsExtension(扩展名); }