如何告诉
QWebPage
不加载特定类型的资源,例如js、css或png?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"
我其实也在为同样的问题苦恼,Piotr 的解决方案假设 URL 带有文件扩展名,但不幸的是这并不总是正确的。
虽然可以获取 MIME 类型,但只能在获取响应后才能获取,这太晚了。
我们尝试获取请求资源的元素上下文,比如说如果是 <img>
元素或者用于获取 CSS 的 <link>
,但是 req.originatingObject()
只会给我们一个 QWebFrame。我知道在 Mozilla 代码中是可以实现的。
顺便说一句,关闭JavaScript和自动加载图片将防止加载图像和脚本。
QNetworkRequest::header()
和QNetworkReply::header()
。 - Piotr Dobrogost