2011-01-01 12 views

Odpowiedz

31

Rozwiązaniem jest rozszerzenie klasy QNetworkAccessManager i zastąpienie tej wirtualnej metody. QNetworkAccessManager::createRequest W naszej implementacji sprawdzamy ścieżkę żądanego adresu URL i jeśli jest to ten, którego nie chcemy pobierać, tworzymy i przekazujemy puste żądanie zamiast ten prawdziwy. Poniżej znajduje się pełny, działający przykład.

#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

Eleganckie rozwiązanie! – ismail

+0

Czy istnieje sposób sprawdzenia nie według rozszerzenia, ale według typu zawartości? – Zelid

+1

@Zelid Tak. Zobacz 'QNetworkRequest :: header()' i 'QNetworkReply :: header()' –

-1

Jeśli twoim celem jest zapobieganie stronie internetowej zmianę, można spojrzeć na

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

w QWebPage. Możesz sprawdzić żądanie i zwrócić false, jeśli chcesz zapobiec wysłaniu żądania.

+2

To jest złe z tego samego powodu, dla którego odpowiedź hmuelnera jest błędna. Z [docs] (http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest) * Ta funkcja jest wywoływana za każdym razem, gdy WebKit żąda ** nawigacji ** ramki do zasobu określonego przez żądanie za pomocą określonego typu typu nawigacji. * –

0

Tak naprawdę mam problem z tym samym, rozwiązanie Piotra zakłada adresy URL z rozszerzeniami plików, niestety nie zawsze tak jest.

można uzyskać mime, ale tylko po otrzymaniu odpowiedzi, a to jest zbyt późno.

staraliśmy się kontekst elementu żądającego zasobów, powiedzieć, czy jest to element <img> lub <link> dostać CSS, ale req.originatingObject() daje nam tylko QWebFrame. Wiem na przykład, że było to możliwe w kodzie mozilla.

BTW, wyłączając JavaScript i zdjęć obciążenie auto uniemożliwi ładowanie obrazów i skryptów.

+1

Możesz spróbować utworzyć żądanie HEAD tylko po to, aby uzyskać nagłówki, dzięki czemu możesz sprawdzić nagłówek Content-Type i podjąć decyzję na podstawie jego wartości. –

Powiązane problemy