QT 从 QWebView 的 QNetworkAccessManager 读取数据
Posted
技术标签:
【中文标题】QT 从 QWebView 的 QNetworkAccessManager 读取数据【英文标题】:QT Reading data from QWebView's QNetworkAccessManager 【发布时间】:2012-06-21 06:33:47 【问题描述】:我正在尝试使用 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】:QNetworkAccessManager 和 QNetworkReply 都是异步 IO 类,A.K.A 非阻塞 IO,这意味着 createRequest() 将立即返回,而无需等待 QNetworkReply 完成获取/创建请求。因此,如果您立即阅读,几乎可以肯定它是空的。
您需要做的是连接 QNetworkReply 的 readyread() 信号,该信号将在您的数据准备好后发出。更多详情请阅读the docs
编辑:哦,还有一件事,正如the question you linked 回答的那样,请使用 peek() 而不是 readAll() 因为您的 QWebView 在您读取数据后将不会收到数据(QIODevices 在一次读取后清除所有系统资源)
【讨论】:
以上是关于QT 从 QWebView 的 QNetworkAccessManager 读取数据的主要内容,如果未能解决你的问题,请参考以下文章
Qt:QWebview 不在另一台机器上显示 jpg、gif、png 图像
Qt 5.3 使用原来的QT4.8.4项目时QWebView QWebFrame