2011-01-01 4 views

Antwort

31

Die Lösung ist QNetworkAccessManager Klasse zu erweitern und es ist virtuelle Methode QNetworkAccessManager::createRequest In unserer Implementierung überschreiben überprüfen wir den Pfad der angeforderten URL und wenn es die ist, wollen wir nicht zum Download wir erstellen und stattdessen eine leere Anforderung über von der echte. Unten finden Sie ein vollständiges, funktionierendes Beispiel.

#include <QApplication> 
#include <QUrl> 

#include <QtWebKit/QWebPage> 
#include <QtWebKit/QWebFrame> 

#include <QtNetwork/QNetworkAccessManager> 
#include <QtNetwork/QNetworkRequest> 
#include <QtNetwork/QNetworkReply> 
#include <QDebug> 


class NAM : public QNetworkAccessManager { 

    Q_OBJECT 

protected: 

    virtual QNetworkReply * createRequest(Operation op, 
              const QNetworkRequest & req, 
              QIODevice * outgoingData = 0) { 

     if (req.url().path().endsWith("css")) { 
      qDebug() << "skipping " << req.url(); 
      return QNetworkAccessManager::createRequest(QNetworkAccessManager::GetOperation, 
                 QNetworkRequest(QUrl())); 
     } else { 
      return QNetworkAccessManager::createRequest(op, req, outgoingData); 
     } 
    } 
}; 


int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWebPage page; 
    NAM nam; 

    page.setNetworkAccessManager(&nam); 
    page.mainFrame()->load(QUrl("http://google.com")); 

    app.exec(); 
} 

#include "main.moc" 
+0

Elegante Lösung! – ismail

+0

Gibt es eine Möglichkeit, nicht nach Erweiterung, sondern nach Inhaltstyp zu überprüfen? – Zelid

+1

@Zelid Ja. Siehe 'QNetworkRequest :: header()' und 'QNetworkReply :: header()' –

-1

Wenn Ihr Ziel ist die Webseite von Wechsel zu verhindern, können Sie bei

virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);

in QWebPage einen Blick darauf werfen. Sie können die Anforderung prüfen und false zurückgeben, wenn Sie verhindern möchten, dass die Anforderung gesendet wird.

+2

Das ist aus dem gleichen Grund falsch, hmuellers Antwort ist falsch. Aus der [docs] (http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest) * Diese Funktion wird immer dann aufgerufen, wenn WebKit ** zum Navigieren ** frame an die angegebene Ressource anfordert Anfrage mit Hilfe des angegebenen Navigationstyps. * –

0

Ich kämpfe eigentlich mit dem gleichen Problem, Piotr Lösung nimmt URLs mit Dateiendungen, leider ist das nicht immer der Fall.

es ist moeglich, mime-type zu bekommen, aber erst nachdem wir die Antwort erhalten haben, und das ist offcore zu spaet.

wir das Element Kontext anfordert, die Ressourcen zu erhalten versucht, sagen, wenn es ein <img> Element oder <link> ist CSS zu bekommen, aber req.originatingObject() gibt uns nur einen QWebFrame. Ich weiß zum Beispiel, dass dies in Mozilla-Code möglich war.

BTW, das Ausschalten Javascript und Autolade Bilder werden Laden von Bildern und Skripten verhindern.

+1

Sie könnten versuchen, eine HEAD-Anfrage zu machen, nur um Kopfzeilen zu erhalten, so dass Sie den Content-Type-Header überprüfen und basierend auf seinem Wert eine Entscheidung treffen können. –