我使用qt5.3并在发布之前搜索了很多内容。
我想从QNetworkReply
读取数据。我有QWebView
,我还需要QWebView
读取http响应才能显示网页。我需要的只是记录网页内容或对http帖子的任何回复。
问题是QNetworkReply
只能读一次。
如果我选择readAll()
信号时拨打readyRead()
,我会获得完整的数据。但它会被清除,因此QWebView
不会显示任何内容(它不会获得任何回复数据)。
或者,如果我选择finished()
信号,因为数据已由QWebView
(或QNetworkAccessManager
)读取,如果我在这里拨打readAll()
,我什么都得不到。是否存在QNetworkReply
或经理或任何类别存储我仍然可以阅读的数据的地方?
在#1中,如果我拨打peek()
,我可以获得部分数据。此功能不会清除响应数据。但如果反应机构很大,它就不会起作用。 QNetworkReply
是一个连续的事情,我既不知道它的数据,也不能读取比缓冲更多。
我不知道该怎么办.....
我只想监视并记录我QWebView
上发出的任何请求的请求和响应正文......
编辑:请注意,我从响应中读取的数据大小只有1MB,因此无需进一步阅读即可查看整个数据。
答案 0 :(得分:0)
您可以创建自己的QNetworkAccessManager
子类并覆盖虚函数createRequest
。调用基类实现以获取响应对象并将readyRead
信号连接到将捕获数据的某个插槽。在那个插槽中调用peek函数读取数据,以便WebKit也可以获取数据:
class NetworkAccessManagerProxy : public QNetworkAccessManager {
Q_OBJECT
signals:
void dataGot(QByteArray data);
public:
NetworkAccessManagerProxy(QObject * parent = 0)
: QNetworkAccessManager()
{
}
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice *outgoingData)
{
reply = QNetworkAccessManager::createRequest(op, request, outgoingData);
connect(this,SIGNAL(readyRead()), SLOT(readInternal()));
return reply;
}
private slots:
void readInternal()
{
QByteArray data = reply->peek(reply->bytesAvailable());
emit dataGot(data);
}
private:
QNetworkReply* reply;
};
创建QWebPage
对象后,调用setNetworkAccessManager
并传递新创建的子类实例:
QWebPage * page = new QWebPage;
page->setNetworkAccessManager(new NetworkAccessManagerProxy());
page->mainFrame()->load(url);
webView->setPage(page);