如何告诉QWebPage不加载特定类型的资源?

时间:2011-01-01 18:54:13

标签: qt qtwebkit qnetworkaccessmanager qwebpage

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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

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

有可能获得mime类型,但只有在我们得到响应后才能获得#m;这是非常晚的。

我们尝试获取请求资源的元素上下文,比如它是<img>元素还是<link>来获取CSS,但是req.originatingObject() 只给我们一个 QWebFrame 。 我知道例如在mozilla代码中这是可能的。

BTW,关闭 javascript 自动加载图片会阻止加载图片和脚本。

答案 2 :(得分:-1)

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

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

在QWebPage中

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