一、描述
QBuffer 继承自 QIODevice。提供了使用 QIODevice 接口访问 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() 直接访问此缓冲区。
- 调用 open() 打开缓冲区。
- 调用 write() 或 putChar() 写入缓冲区。
- 调用 read()、readLine()、readAll() 或 getChar() 从缓冲区中读取。
- 调用 seek() 寻找缓冲区中的任意位置。
- 访问缓冲区完成后,调用 close()。
使用 QDataStream 和 QBuffer 将数据写入 QByteArray:
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
QDataStream out(&buffer);
out << QApplication::palette();
当新数据到达缓冲区时,QBuffer 发出 readyRead()。通过连接到这个信号,可以在处理之前使用 QBuffer 来存储临时数据。每当新数据写入缓冲区时,QBuffer 也会发出 bytesWritten() 。
二、成员函数
1、QBuffer(QByteArray *byteArray, QObject *parent = nullptr)
构造一个 QBuffer,它使用 byteArray 指向的 QByteArray 作为其内部缓冲区,并具有给定的父级。调用者负责确保 byteArray 保持有效,直到 QBuffer 被销毁,或者直到调用 setBuffer() 来更改缓冲区。 QBuffer 不拥有 QByteArray 的所有权。
QByteArray byteArray("abc");
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
buffer.seek(3);
buffer.write("def", 3);
buffer.close(); // byteArray == "abcdef"
QBuffer(QObject *parent = nullptr)
使用给定的父级构造一个空缓冲区。可以调用 setData() 用数据填充缓冲区,或者可以在写入模式下打开它并使用 write()。
2、QByteArray & buffer() / const QByteArray & buffer()
返回对 QBuffer 内部缓冲区的引用。
3、const QByteArray & data()
返回缓冲区中包含的数据。这与 buffer() 相同。
4、void setBuffer(QByteArray *byteArray)
使 QBuffer 使用 byteArray 指向的 QByteArray 作为其内部缓冲区。调用者负责确保 byteArray 保持有效,直到 QBuffer 被销毁,或者直到调用 setBuffer() 来更改缓冲区。QBuffer 不拥有 QByteArray 的所有权。
如果 isOpen() 为true,则什么都不做。
如果 byteArray 为 nullptr,则缓冲区会在内部创建空的 QByteArray 以进行处理。
5、void setData(const QByteArray &data)
将内部缓冲区的内容设置为数据。和 setBuffer() 一致。
如果 isOpen() 为真,则什么都不做。
void setData(const char *data, int size)
将内部缓冲区的内容设置为数据的第一个size字节。