我使用的是qt 5.3。
我有一个很重要的东西写入QIODevice进行阅读。我希望有一个代理来获取数据,同时保持QIODevice中的数据可供其他东西读取。因此,如果我调用readAll(),我会在代理中获得一切好处,但其他读者无法获取任何数据。
我想我应该使用peek(),但这似乎需要一个maxsize。我试图传递size()或bytesAvailable(),但他们没有给我真正的大小。它们可能返回一个奇怪值的缓冲区大小为3287.但是我的数据大到1081530字节。
如何才能获得我的QIODevice的真实尺寸?
编辑:我上面提到的QIODevice实际上是QNetworkReply。我想创建一个代理来观察我的程序的请求和响应数据与QWebView访问一些Flash游戏。我实现了我的QNetworkAccessManager子类的createRequest,我要分析的东西是我通过createRequest的回复的finished()信号捕获的。
Edit2:我注意到这个QIODevice是顺序的,因此大小未知。但如何在不清除数据的情况下读取数据呢?
答案 0 :(得分:1)
您可以使用QIODevice::seek
,然后再次阅读数据
来自seek
文件:
对于随机访问设备,此功能将当前位置设置为 pos,成功时返回true,如果发生错误则返回false。对于 顺序设备,默认行为是什么都不做并返回 假的。
答案 1 :(得分:0)
您可以使用Qt直接从QNetworkReply
标题中提取内容的大小,如下所示:
qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
然后将该大小与peek
函数一起使用,例如:
void DownloadManager::downloadFinished(QNetworkReply *reply)
{
if (!reply->error())
{
bool ok;
qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(&ok);
if (ok)
{
QByteArray data = reply->peek(size); //Here lives your data without reset the internal buffer
//Do something
}
else
{
qDebug() << "Could not read the header";
}
}
//If you are ready then delete
reply->deleteLater();
}