C++ 自定义QAbstractNetworkCache实现;QAbstractNetworkCache::insert(QIODevice*设备)设备没有数据

C++ 自定义QAbstractNetworkCache实现;QAbstractNetworkCache::insert(QIODevice*设备)设备没有数据,c++,qt,qt4.8,qtcore,qiodevice,C++,Qt,Qt4.8,Qtcore,Qiodevice,我正在尝试构建自己的自定义QAbstractNetworkCache实现,以便与QNetworkAccessManager一起使用 我在使用QAbstractNetworkCache::insert(QIODevice*设备)时遇到问题;在这个方法中,设备到达时总是有0个字节要读取 据我所知,下载完成后,从QAbstractNetworkCache::prepare(const QNetworkCacheMetaData&metaData)返回的QIODevice*将填充数据并用作QAbstra

我正在尝试构建自己的自定义
QAbstractNetworkCache
实现,以便与
QNetworkAccessManager
一起使用

我在使用QAbstractNetworkCache::insert(QIODevice*设备)时遇到问题;在这个方法中,设备到达时总是有0个字节要读取

据我所知,下载完成后,从
QAbstractNetworkCache::prepare(const QNetworkCacheMetaData&metaData)
返回的
QIODevice*
将填充数据并用作
QAbstractNetworkCache::insert(QIODevice*设备)
方法的参数

所以我准备了一个
QBuffer
作为这个容器,但是每当调用
QAbstractNetworkCache::insert(QIODevice*device)
时,它总是到达时没有任何内容
(device->bytesavable()==0)

QIODevice*NetworkCachePrivate::prepare(const QNetworkCacheMetaData&metaData){
如果(!metaData.isValid()| | |!metaData.url().isValid()| | cacheDir.isEmpty())返回0;
QIODevice*设备=0;
QString hash=hexMD5(metaData.url().toString());
QScopedPointer缓冲区(新的QBuffer);
如果(缓冲区->打开(QIODevice::读写))
{

qDebug()正如peppe在评论中指出的那样,您需要在写入之后和读取之前按照以下步骤查找
QBuffer

QBuffer允许您使用QIODevice接口访问QByteArray。QByteArray被视为标准随机访问文件。示例:

为了使代码更具体,需要插入如下语句:

...
device.seek(0);
qDebug() << "DEVICE BYTES" << device->bytesAvailable(); //NOT 0 ANYMORE!!!! :)
...
。。。
设备寻道(0);

qDebug()你确定问题不在于
QBuffer
简单地返回0,因为它是一个随机访问I/O设备,并且它的当前位置在缓冲区的末尾(因为写入程序刚刚用数据填充了它)?嗯,可能是。我会马上尝试从头开始查找。是的,facepalm。很明显:(.谢谢。@peppe PS.您可能想复制评论作为答案,这样我就可以接受了。:)
QBuffer buffer;
char ch;

buffer.open(QBuffer::ReadWrite);
buffer.write("Qt rocks!");
*** buffer.seek(0); ***
buffer.getChar(&ch);  // ch == 'Q'
buffer.getChar(&ch);  // ch == 't'
buffer.getChar(&ch);  // ch == ' '
buffer.getChar(&ch);  // ch == 'r'
...
device.seek(0);
qDebug() << "DEVICE BYTES" << device->bytesAvailable(); //NOT 0 ANYMORE!!!! :)
...