2012-02-14 17 views
6

içinde HTTP Hatası sayfasını geçersiz kıl QWebView içinde bir hata sayfası görüntülemek istiyorum. Örneğin, sunucu bir 404 Hata değerini döndürürse, kendi özel 404 Hata sunucusundan sunucudan gönderilen yerine görüntülemelidir.QtWebkit

Hata durumlarını işlemek için QWebPage::extension kullanıyorum ve Ağ Hataları için iyi çalışıyor. Ancak, sunucu bir hata 404 döndürür ve aynı zamanda bir hata sayfası verirse, bu sayfa görüntülenir ve QWebPage::extension yöntemi hiçbir zaman çağrılmaz.

QtWebKit'i hata işleyicisini çağırmaya zorlamak ve sunucu hata sayfasını geçersiz kılmak için bir yol var mı?

cevap

2

Bir not senin Ağ hataları sayfa öğeleriyle (harici görüntüler veya komut dosyaları gibi) meydana gelirse, yüklü sayfa yerine hata sayfası. Başka bir seçenek QWebPage :: extension() ve QWebPage :: supportsExtension() öğesinin yeniden uygulanması olacaktır. Bu durumda QT Webkit, sayfa hataları için extension() uygulamanızı çağıracak ve sayfa içeriğini sağladığınız sayfala değiştirecektir. gibi:

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

çeşitli şeyler denemeye, yeterince uzun kod atlamalı sonra aşağıdaki en azından benim olayı çözmek için görünüyor: görebileceğiniz siz) (handleNetworkFinished içinde yuvayı anabilgisayar içeriği değiştirirseniz,

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

Bu gerçekten sorunumu çözdüğünüz için teşekkür ederiz. – Pascal