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!!!! :)
...