2011-01-01 5 views

Respuesta

31

La solución es ampliar la clase QNetworkAccessManager y anular su método virtual QNetworkAccessManager::createRequest En nuestra implementación, verificamos la ruta de la URL solicitada y si es la que no queremos descargar creamos y entregamos una solicitud vacía en lugar de el original. A continuación se muestra un ejemplo completo y funcional.

#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

¡Solución elegante! – ismail

+0

¿Hay alguna forma de verificar no por extensión sino por tipo de contenido? – Zelid

+1

@Zelid Sí. Ver 'QNetworkRequest :: header()' y 'QNetworkReply :: header()' –

-1

Si su objetivo es evitar que la página web de cambiar, se puede echar un vistazo a

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

en QWebPage. Puede inspeccionar la solicitud y devolver false si desea evitar que se envíe la solicitud.

+2

Esto es incorrecto por la misma razón que la respuesta de hmuelner es incorrecta. Desde [docs] (http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest) * Esta función se invoca cada vez que WebKit solicita ** navegar ** frame al recurso especificado por solicitud por medio del tipo de tipo de navegación especificado. * –

0

En realidad, estoy luchando con el mismo problema, la solución de Piotr está asumiendo las URL con extensiones de archivo, lamentablemente este no es siempre el caso.

es posible obtener el tipo de mímica, pero solo después de que recibamos la respuesta 'y esto es demasiado tarde.

tratamos de conseguir el contexto elemento de solicitar los recursos, dicen que si se trata de un elemento <img> o <link> para obtener CSS, pero req.originatingObject() sólo nos da una QWebFrame. , sé por ejemplo que esto fue posible en el código de mozilla.

Por cierto, apagar Javascript y imágenes de carga automática evitarán que la carga de imágenes y secuencias de comandos.

+1

Puede intentar hacer una solicitud HEAD solo para obtener encabezados para que pueda verificar el encabezado Content-Type y tomar decisiones en función de su valor. –

Cuestiones relacionadas