QBuffer Class
QBuffer 类为QByteArray 提供了一个QIODevice 接口。更多内容...
| 头文件: | #include <QBuffer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 继承自: | QIODevice |
- 所有成员列表,包括继承的成员
- QBuffer 属于“输入/输出和网络”模块。
注意:该类中的所有函数均为可重入的。
公共函数
| QBuffer(QObject *parent = nullptr) | |
| QBuffer(QByteArray *byteArray, QObject *parent = nullptr) | |
| virtual | ~QBuffer() |
| QByteArray & | buffer() |
| const QByteArray & | buffer() const |
| const QByteArray & | data() const |
| void | setBuffer(QByteArray *byteArray) |
| void | setData(const QByteArray &data) |
| void | setData(const char *data, qsizetype size) |
重新实现的公共函数
| virtual bool | atEnd() const override |
| virtual bool | canReadLine() const override |
| virtual void | close() override |
| virtual bool | open(QIODeviceBase::OpenMode mode) override |
| virtual qint64 | pos() const override |
| virtual bool | seek(qint64 pos) override |
| virtual qint64 | size() const override |
重新实现的受保护函数
| virtual qint64 | readData(char *data, qint64 len) override |
| virtual qint64 | writeData(const char *data, qint64 len) override |
详细说明
QBuffer 允许您通过QIODevice 接口访问QByteArray 。该QByteArray 将被视为一个标准的随机访问文件。示例:
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'默认情况下,创建 QBuffer 时会为您自动创建一个内部的QByteArray 缓冲区。您可以通过调用buffer() 直接访问该缓冲区。您也可以通过调用setBuffer(),或将数组传递给 QBuffer 的构造函数,将 QBuffer 与现有的QByteArray 结合使用。
调用open()来打开缓冲区。然后调用write()或putChar()向缓冲区写入数据,并调用read()、readLine()、readAll()或getChar()从缓冲区读取数据。size()返回缓冲区的当前大小,您可以通过调用seek()在缓冲区中定位到任意位置。 完成对缓冲区的访问后,请调用close()。
以下代码片段演示了如何使用QDataStream 和QBuffer将数据写入QByteArray :
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
QDataStream out(&buffer);
out << palette;实际上,我们将应用程序的QPalette 转换为一个字节数组。以下是从QByteArray 中读取数据的方法:
QPalette palette;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::ReadOnly);
QDataStream in(&buffer);
in >> palette;QTextStream 此外,QDataStream 还提供了便捷的构造函数,这些构造函数接受QByteArray 作为参数,并在后台自动创建 QBuffer。
当缓冲区中有新数据到达时,QBuffer 会发出readyRead() 信号。通过连接此信号,您可以使用 QBuffer 在处理数据之前存储临时数据。此外,每当有新数据写入缓冲区时,QBuffer 还会发出bytesWritten() 信号。
另请参阅 QFile 、QDataStream 、QTextStream 以及QByteArray 。
成员函数文档
[explicit] QBuffer::QBuffer(QObject *parent = nullptr)
使用给定的parent 构建一个空缓冲区。您可以调用setData()向缓冲区中写入数据,或者以写入模式打开该缓冲区并使用write()。
另请参阅 open()。
QBuffer::QBuffer(QByteArray *byteArray, QObject *parent = nullptr)
构建一个QBuffer,该QBuffer使用byteArray 所指向的QByteArray 作为其内部缓冲区,并采用给定的parent 。调用方有责任确保byteArray 在QBuffer被销毁之前,或者在调用setBuffer()以更改缓冲区之前,始终保持有效。QBuffer不会获取QByteArray 的所有权。
如果您以只写模式或读写模式打开缓冲区,并向 QBuffer 中写入数据,则byteArray 将会被修改。
示例:
QByteArray byteArray("abc");
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
buffer.seek(3);
buffer.write("def", 3);
buffer.close();
// byteArray == "abcdef"另请参阅 open()、setBuffer() 和setData()。
[virtual noexcept] QBuffer::~QBuffer()
销毁缓冲区。
[override virtual] bool QBuffer::atEnd() const
重新实现了:QIODevice::atEnd() const。
QByteArray &QBuffer::buffer()
返回对QBuffer 内部缓冲区的引用。您可以利用它,在QBuffer 不知情的情况下修改QByteArray 。
const QByteArray &QBuffer::buffer() const
这与data() 相同。
这是一个重载函数。
[override virtual] bool QBuffer::canReadLine() const
重新实现了:QIODevice::canReadLine() const。
[override virtual] void QBuffer::close()
重写了:QIODevice::close()。
const QByteArray &QBuffer::data() const
返回缓冲区中包含的数据。
这与buffer() 相同。
[override virtual] bool QBuffer::open(QIODeviceBase::OpenMode mode)
重写了:QIODevice::open (QIODeviceBase::OpenMode 模式)。
使用mode 标志打开缓冲区,成功时返回true ;否则返回false 。
mode 的标志必须包含QIODeviceBase::ReadOnly 、WriteOnly 或ReadWrite 。否则,将打印错误信息且该方法失败。在其他任何情况下,该方法均成功。
与QFile::open() 不同,使用WriteOnly 打开QBuffer 时不会截断该文件。不过,pos() 会被设置为0 。若要更改上述任一行为,请使用Append 或Truncate 。
[override virtual] qint64 QBuffer::pos() const
重新实现了:QIODevice::pos() const。
[override virtual protected] qint64 QBuffer::readData(char *data, qint64 len)
重写了:QIODevice::readData(char *data, qint64 maxSize)。
[override virtual] bool QBuffer::seek(qint64 pos)
重新实现了:QIODevice::seek (qint64 正数)。
void QBuffer::setBuffer(QByteArray *byteArray)
使QBuffer 使用由byteArray 指向的QByteArray 作为其内部缓冲区。调用方有责任确保byteArray 在QBuffer 被销毁之前,或者在调用setBuffer()更改缓冲区之前,始终保持有效。QBuffer 不会获取QByteArray 的所有权。
如果isOpen() 为真,则不执行任何操作。
若以只写模式或读写模式打开缓冲区,并向QBuffer 写入内容,则byteArray 将被修改。
示例:
QByteArray byteArray("abc");
QBuffer buffer;
buffer.setBuffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
buffer.seek(3);
buffer.write("def", 3);
buffer.close();
// byteArray == "abcdef"如果 `byteArray ` 为 `nullptr`,则缓冲区会创建自己的内部 `QByteArray ` 用于处理。该字节数组初始为空。
另请参阅 buffer()、setData() 和open()。
void QBuffer::setData(const QByteArray &data)
将内部缓冲区的内容设置为data 。这与将data 赋值给buffer()的效果相同。
如果isOpen() 为真,则不执行任何操作。
void QBuffer::setData(const char *data, qsizetype size)
将内部缓冲区的内容设置为data 的前size 字节。
注意:在 Qt 6.5 之前的版本中,此函数将长度作为int 参数,可能会导致数据被截断。
这是一个重载函数。
[override virtual] qint64 QBuffer::size() const
重新实现了:QIODevice::size() const。
[override virtual protected] qint64 QBuffer::writeData(const char *data, qint64 len)
重新实现了:QIODevice::writeData (const char *data, qint64 maxSize)。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.