在网络连接中篡改发送/接收到服务器的数据的正确方法是使用QNetworkAccessManager。
这个类允许你向服务器发送请求(可能带有标头)并获得响应(也带有标头)。
您可以访问在相应的QNetworkReply 对象上接收到的数据。还有响应的标题:
{
...
QNetworkAccessManager *qnam = new QNetworkAccessManager(this);
connect(qnam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.setUrl(QUrl("http://stackoverflow.com"));
request.setRawHeader("User-Agent", "Foo browser");
qnam->get(QNetworkRequest(request));
...
}
然后定义槽:
void MyWidget::replyFinished(QNetworkReply *reply)
{
QByteArray response = reply->readAll();
QString mime = reply->header(QNetworkRequest::ContentTypeHeader).toString();
...
}
查看文档here 和here。
事实上,QWebView 有一个QNetworkAccessManager 对象来执行请求和管理回复。您可以通过QWebPage::networkAccessManager() 方法获取该对象。您可以通过QWebView::page() 从QWebView 获取QWebPage。
编辑
要操作QWebView显示的网页,可以直接通过webView->setHtml(QString html)设置一个新的HTML内容。
您也可以通过QWebFrame 类的方法直接访问HTML。
要获得这样的对象,你必须这样做:
QWebFrame *wb = webView->page()->currentFrame();
方法有:
void QWebFrame::setContent ( const QByteArray & data, const QString & mimeType = QString(), const QUrl & baseUrl = QUrl() ) 用于在字节数组中设置新文档。
void QWebFrame::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() ) 的作用相同,但将内容视为 HTML 文档。
QString QWebFrame::toHtml () const 以 HTML 文档的形式获取内容。
QString QWebFrame::toPlainText () const同上,纯文本格式。
查看这些函数的文档。
编辑 2:
最后,如果您想访问或过滤QWebView 本身发出的请求,我只能看到一种方法:从QNetworkAccessManager 派生一个类并覆盖用于发出请求和接收答案的方法。
然后,将该类的一个实例设置为 QWebView 使用的 QNetworkAccessManager。
让我用一个骨架来澄清一下:
class MyNAM : public QNetworkAccessManager
{
// ...
MyNAM(QObject *parent = 0) : QNetworkAccessManager(parent) { }
// ...
virtual QNetworkReply * createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0) {
// e.g. logging of the request
// e.g. decide if the request must be made
if (some_bool_deciding) {
QNetworkAccessManager::createRequest(op, req, outgoingData);
}
else {
// or faked...
}
// etc.
}
// ...
};
在您的主应用程序中,您必须:
// ...
MyNAM *nam = new MyNAM();
webview->page()->setNetworkAccessManager(nam);
// ...
从现在开始,所有请求都将使用该对象进行。
此方法允许完全控制导航器发出的请求:过滤和访问请求数据(标头、获取和发布值等)。您可以记录请求、分析请求及其 POST/GET 字段等。
希望最终有所帮助!