QT从QWebView的QNetworkAccessManager读取数据

时间:2012-06-21 06:33:47

标签: qt qwebview qnetworkaccessmanager

我正在尝试使用QNetworkAccessManager从QWebView读取响应数据。

我按照此处的回复中的说明进行了操作: how to get response in QtWebKit

我将QNetworkAccessManager子类化,然后将QWebView设置为使用我的类:

ui->explorer->page()->setNetworkAccessManager(new myNetworkAccessManager());

然后我重写createRequest函数并尝试读取数据:

#include "mynetworkaccessmanager.h"
myNetworkAccessManager::myNetworkAccessManager(QObject *parent) :
    QNetworkAccessManager(parent)
{
}
QNetworkReply *myNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData){
    QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData);
    qDebug() << reply->readAll();
    return reply;
}

我仍然得到空数据。 我做错了什么?

1 个答案:

答案 0 :(得分:2)

QNetworkAccessManager和QNetworkReply都是异步IO类,A.K.A非阻塞IO,这意味着createRequest()将立即返回,而无需等待QNetworkReply完成获取/创建请求。因此,如果你立即阅读,几乎肯定会有空。

您需要做的是连接QNetworkReply的readyread()信号,该信号将在数据准备好后发出。有关详细信息,请参阅the docs

编辑:哦,还有一件事,正如the question you linked所回答的那样,确实使用peek()而不是readAll(),因为你的QWebView在读取之后将不会收到数据(QIODevices在一次读取后清除所有系统资源) )