我正在使用 qt5.3,在发布之前我搜索了很多。
我想从QNetworkReply. 我有一个QWebView,我还需要读取 http 响应QWebView以显示网页。我需要的只是记录 Web 内容或对 http 帖子的任何响应。
问题是QNetworkReply某些东西只能读取一次。
如果我readAll()在选择readyRead()信号时调用,我将获得完整数据。但它会被清除,所以QWebView什么都不显示(它不会得到任何回复数据)。
或者如果我选择finished()信号,因为数据已经被QWebView(或QNetworkAccessManager)读取,如果我readAll()在这里打电话,我什么也得不到。是否有某个地方QNetworkReply,或经理或任何班级,存储我仍然可以读取的数据?
在#1 中,如果我调用peek(). 该函数不清除响应数据。但是如果响应体很大,它就行不通。这QNetworkReply是一个连续的东西,我既不能知道它的数据,也不能比缓冲的更进一步。
我不知道如何处理这个......
我只想监视和记录在我的QWebView...上发出的任何请求的请求和响应正文。
编辑:请注意,我要从响应中读取的数据大到 1MB,因此如果不进一步阅读就无法查看整个数据。
如何QNetworkReply在 QWebPage 之前从特定 URL的响应中读取数据?但是当finished()发出信号时,QWebPage 已经读取了回复,因此连接readyRead()或调用不reply->readAll()返回任何内容。我在自己的 QWebPage 类中尝试了重载 acceptNavigationRequest() 方法,如下所示:
bool webPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, QWebPage::NavigationType type)
{
//qDebug() << "filename = " << request.rawHeader("content-disposition");
if(request.url().path() == QStringLiteral("download.php"))
{
QNetworkReply *reply = networkAccessManager()->get(request);
QFile file;
file.setFileName(filename);
if(!file.open(QIODevice::ReadWrite))
{
/* handle error */
}
file.write(reply->readAll());
file.close();
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是我无法回复工作......返回的回复无效(甚至不返回http状态代码,我知道这意味着发送的http请求无效但我不知道为什么)。
欢迎使用不同的方法来解决这个问题!
我阅读了 signal finish() 的文档,它并没有说 finish() 总是被发出。我读到了 error() 信号:
void QNetworkReply::error(QNetworkReply::NetworkError code) 当回复检测到处理错误时发出此信号。Finished() 信号可能会随之而来,表明连接已结束。
code 参数包含检测到的错误的代码。调用 errorString() 获取错误情况的文本表示。
注意:不要删除连接到该信号的槽中的对象。使用deleteLater()。
另请参见 error() 和 errorString()。
该行是否The finished() signal will probably follow意味着在某些情况下 QNetworkReply 不会发出 finish() ?
我想获取网页的源(HTML),例如StackOverflow的主页.
这是我到目前为止编码的内容:
QNetworkAccessManager manager;
QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url)));
QString html = response->readAll(); // Source should be stored here
Run Code Online (Sandbox Code Playgroud)
但没有任何反应!当我尝试获取html字符串的值时,它是空的("").
那么该怎么办?我正在使用Qt 5.3.1.