2

我正在使用 qt 5.3。

我有一件大事写入 QIODevice 以供阅读。我希望有一个代理来获取数据,同时保持 QIODevice 中的数据可供其他东西读取。因此,如果我调用 readAll() 我将在代理中获得一切良好但其他阅读器无法获得任何数据。

我想我应该使用 peek() 但这似乎需要一个 maxsize。我尝试传递 size() 或 bytesAvailable() 但他们没有给我真正的大小。他们返回的缓冲区大小可能是一些奇怪的值,如 3287。但我的数据有 1081530 字节那么大。

如何获取 QIODevice 的真实大小以供读取?

编辑:我上面提到的 QIODevice 实际上是 QNetworkReply。我想创建一个代理来观察我的程序的请求和响应数据,并使用 QWebView 访问一些 Flash 游戏。我实现了我的 QNetworkAccessManager 子类的 createRequest,我想分析的是我通过 createRequest 回复的finished() 信号捕获的。

Edit2:我注意到这个 QIODevice 是一个连续的,所以大小是未知的。但是如何在不清除数据的情况下读取数据呢?

4

2 回答 2

1

您可以使用QIODevice::seek然后再次
seek文档中读取数据:

对于随机访问设备,此函数将当前位置设置为 pos,成功时返回 true,如果发生错误则返回 false。对于顺序设备,默认行为是什么都不做并返回 false。

于 2014-08-05T11:41:18.577 回答
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();
}
于 2014-08-11T08:45:12.030 回答