我想在QWebView
中显示错误页面。例如,如果服务器返回的404的QWebView
应显示其自己的自定义的404而不是一个从服务器发送。覆盖QtWebkit中的HTTP错误页面
我用QWebPage::extension
处理错误情况,它可以很好地用于网络错误。 但是,如果服务器返回一个错误,并在同一时间返回错误页面,在此页显示和QWebPage::extension
方法不会被调用。
有没有办法强制QtWebKit调用错误处理程序并覆盖服务器错误页面?
我想在QWebView
中显示错误页面。例如,如果服务器返回的404的QWebView
应显示其自己的自定义的404而不是一个从服务器发送。覆盖QtWebkit中的HTTP错误页面
我用QWebPage::extension
处理错误情况,它可以很好地用于网络错误。 但是,如果服务器返回一个错误,并在同一时间返回错误页面,在此页显示和QWebPage::extension
方法不会被调用。
有没有办法强制QtWebKit调用错误处理程序并覆盖服务器错误页面?
一个说明,如果你在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);
}
周围的跳码足够长的时间,尝试各种事情之后,下面似乎解决至少我的情况:
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);
}
}
谢谢这确实解决了我的问题。 – Pascal 2012-04-03 08:45:47