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

Qt 如何告诉QWebPage不要加载特定类型的资源?,qt,qtwebkit,qnetworkaccessmanager,qwebpage,Qt,Qtwebkit,Qnetworkaccessmanager,Qwebpage,如何告知不要加载特定类型的资源,如js、css或png?解决方案是在我们的实现中扩展类并覆盖它的虚拟方法,我们检查请求url的路径,如果它是我们不想下载的,我们创建并提交一个空请求,而不是真实的请求。 下面是一个完整的工作示例 #include <QApplication> #include <QUrl> #include <QtWebKit/QWebPage> #include <QtWebKit/QWebFrame> #include &l

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

解决方案是在我们的实现中扩展类并覆盖它的虚拟方法,我们检查请求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"
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
NAM类:公共QNetworkAccessManager{
Q_对象
受保护的:
虚拟QNetworkReply*createRequest(操作op,
const QNetworkRequest&req,
QIODevice*支出数据=0){
if(req.url().path().endsWith(“css”)){

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

virtualbool-acceptNavigationRequest(QWebFrame*frame,const-QNetworkRequest&request,NavigationType);


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

我实际上也遇到了同样的问题,Piotr解决方案假设URL具有文件扩展名,不幸的是,情况并非总是如此

我们有可能得到mime类型,但只有在我们得到响应之后,这才是最晚的

我们试图获取请求资源的元素上下文,比如说它是
元素还是
获取CSS,但是
req.origingObject()
只为我们提供了一个QWebFrame。 例如,我知道这在mozilla代码中是可能的


顺便说一句,关闭javascript自动加载图像将阻止加载图像和脚本。

有没有办法不通过扩展而是通过内容类型进行检查?@Zelid是的。请参阅
QNetworkRequest::header()
QNetworkReply::header()
由于Qt删除了webkit,现在使用chromium,QtWebEngine和QtWebView不再与QNetworkAccessManager交互:这是错误的,原因与hmuelner的回答是错误的相同。从中,每当webkit请求通过指定的导航类型将帧导航到请求指定的资源时,就会调用此函数您可以尝试发出HEAD请求来获取头,这样您就可以检查内容类型头并根据其值做出决定。