2011-01-01 4 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

あなたの目標は変化するからWebページを予防することであるならば、あなたはQWebPageで

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

を見てみることができます。要求が送信されないようにするには、要求を検査してfalseを返すことができます。

+2

hmuelnerの答えが間違っているのと同じ理由でこれは間違っています。 [docs](http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest)*この関数は、WebKitから**指定されたリソースへの** navigate **フレームを要求するたびに呼び出されます* –

0

私は実際に同じ問題を抱えていますが、Piotrソリューションではファイル拡張子のあるURLを想定していますが、残念ながらこれは必ずしも当てはまりません。

私たちが応答を得た後でしかつまらないことがありますが、これは後半から後半です。

我々はCSSを取得する<img>要素または<link>であれば言って、リソースを要求要素のコンテキストを取得しようとしたが、req.originatingObject() は私たちだけQWebFrameを与えます。 たとえば、これはmozillaコードで可能であったことが分かります。

ご連絡先:javascriptおよび自動ロードイメージは、画像とスクリプトの読み込みを防止します。

+1

ヘッダーを取得するだけでHEADリクエストを作成して、Content-Typeヘッダーをチェックし、その値に基づいて決定を下すことができます。 –

関連する問題