您不能QBuffer::open()
返回 false (*)。所以你不能QBuffer
在你的场景中使用。
但是子类化和覆盖open()
总是返回 false 呢?
class UnopenableDevice : public QBuffer {
public:
bool open(QIODevice::OpenMode m) { return false; }
};
(*)至少不使用标志WriteOnly
和/或ReadOnly
. 传递无效标志是使其返回 false 的唯一可能性。引用 Qt 4.8.0 来源:
corelib/io/qbuffer.cpp:
332 bool QBuffer::open(OpenMode flags)
333 {
334 Q_D(QBuffer);
335
336 if ((flags & (Append | Truncate)) != 0)
337 flags |= WriteOnly;
338 if ((flags & (ReadOnly | WriteOnly)) == 0) {
339 qWarning("QBuffer::open: Buffer access not specified");
340 return false; // <----- only possibility to return false!
341 }
342
343 if ((flags & Truncate) == Truncate)
344 d->buf->resize(0);
345 d->ioIndex = (flags & Append) == Append ? d->buf->size() : 0;
346
347 return QIODevice::open(flags);
348 }
corelib/io/qiodevice.cpp:
540 bool QIODevice::open(OpenMode mode)
541 {
542 Q_D(QIODevice);
543 d->openMode = mode;
544 d->pos = (mode & Append) ? size() : qint64(0);
545 d->buffer.clear();
546 d->accessMode = QIODevicePrivate::Unset;
547 d->firstRead = true;
548 #if defined QIODEVICE_DEBUG
549 printf("%p QIODevice::open(0x%x)\n", this, quint32(mode));
550 #endif
551 return true;
552 }