2011-01-01 6 views

ответ

31

Решение заключается в расширении класса QNetworkAccessManager и переопределении его виртуального метода. QNetworkAccessManager::createRequest В нашей реализации мы проверяем путь к запрашиваемому URL-адресу, и если это тот, который мы не хотим скачать, мы создаем и передаем пустой запрос вместо настоящий. Ниже приведен полный рабочий пример.

#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

Элегантное решение! – ismail

+0

Есть ли способ проверить не по расширению, а по типу контента? – Zelid

+1

@Zelid Да. См. 'QNetworkRequest :: header()' и 'QNetworkReply :: header()' –

-1

Если ваша цель состоит в том, чтобы предотвратить веб-страницы от изменения, вы можете посмотреть на

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

в QWebPage. Вы можете проверить запрос и вернуть false, если хотите предотвратить отправку запроса.

+2

Это неверно по той же причине, что ответ hmuelner неверен. Из [docs] (http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest) * Эта функция вызывается всякий раз, когда WebKit запрашивает ** перемещать ** кадр на ресурс, указанный в запрос с помощью указанного типа типа навигации. * –

0

Я действительно борюсь с той же проблемой, решение Piotr предполагает URL-адреса с расширениями файлов, к сожалению, это не всегда так.

можно получить mime-type, но только после того, как мы получим ответ ', и это отложено до конца.

мы пытались получить контекст элемента запрашивающего ресурсы, скажем, если это <img> элемент или <link> получить CSS, но req.originatingObject() только дает нам QWebFrame. Я знаю, например, что это было возможно в коде Mozilla.

BTW, отключив JavaScript и изображения автоматической загрузки предотвратит загрузку изображений и скриптов.

+1

Вы можете попробовать сделать запрос HEAD только для получения заголовков, чтобы вы могли проверить заголовок Content-Type и принять решение на основе его значения. –