1

我正在尝试使用 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;
}

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

4

1 回答 1

2

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

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

编辑:哦,还有一件事,正如您所链接的问题所回答的那样,请使用 peek() 而不是 readAll() 因为您的 QWebView 在您阅读后将不会收到数据(QIODevices 在一次阅读后清除所有系统资源)

于 2012-07-13T18:36:56.100 回答