17

如何告诉QWebPage不加载特定类型的资源,如 js、css 或 png?

4

3 回答 3

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"
于 2011-01-03T20:32:34.597 回答
0

我实际上正在努力解决同样的问题,Piotr 解决方案假设 url 带有文件扩展名,不幸的是,情况并非总是如此。

it is possible toe get mime-type but only after we get the response' and this is offcore to late.

we tried to get the element context requesting the resources, say if it is an <img> element or <link> to get CSS, but req.originatingObject() only gives us a QWebFrame. i know for example that this was possible in mozilla code.

BTW, turning off javascript and auto load images will prevent loading of images and scripts.

于 2014-03-23T10:39:25.540 回答
-1

如果您的目标是防止网页更改,您可以查看

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

在 QWebPage 中。false如果您想阻止发送请求,您可以检查请求并返回。

于 2012-01-30T16:11:04.470 回答