QBuffer 类
QBuffer 类提供一个 QIODevice 接口用于 QByteArray。 更多...
头文件 | #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) | |
虚拟 | ~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 flags) 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 的构造函数使用现有的 QByteArray 来使用 QBuffer。
调用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 << QApplication::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。
成员函数文档
[显式]
QBuffer::QBuffer(QObject *parent = nullptr)
使用指定的 parent 构造一个空的缓冲区。你可以调用 setData() 来填充缓冲区中的数据,或者你可以在写入模式下打开它,并使用 write()。
另请参阅: open。
QBuffer::QBuffer(QByteArray *byteArray, QObject *parent = nullptr)
使用由 byteArray 所指的 QByteArray 作为其内部缓冲区的一个 QBuffer,和给定的 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()。
[虚析构函数]
QBuffer::~QBuffer()
销毁缓冲区。
[重写虚函数]
bool QBuffer::atEnd() const
重实现: QIODevice::atEnd() const.
QByteArray &QBuffer::buffer()
返回对 QBuffer 的内部缓冲区的引用。你可以使用它来修改 QByteArray,而不改变 QBuffer。
const QByteArray &QBuffer::buffer() const
这是一个重载函数。
这与 data() 相同。
[覆盖虚函数]
bool QBuffer::canReadLine() const
重新实现:QIODevice::canReadLine() const.
[覆盖虚函数]
void QBuffer::close()
重新实现:QIODevice::close().
const QByteArray &QBuffer::data() const
返回缓冲区中的数据。
这与 buffer() 相同。
[覆盖虚函数]
bool QBuffer::open(QIODeviceBase::OpenMode flags)
重新实现:QIODevice::open(QIODeviceBase::OpenMode mode).
与QFile不同,以只写模式或读写模式打开一个QBuffer QIODevice::WriteOnly不会截断它。然而,pos()被设置为0。使用QIODevice::Append或QIODevice::Truncate来改变任一行为。
[覆盖虚函数]
qint64 QBuffer::pos() const
重新实现:QIODevice::pos() const.
[覆盖虚函数受保护]
qint64 QBuffer::readData(char *data, qint64 len)
重新实现:QIODevice::readData(char *data, qint64 maxSize).
[覆盖虚函数]
bool QBuffer::seek(qint64 pos)
重新实现:QIODevice::seek(qint64 pos).
void QBuffer::setBuffer(QByteArray *byteArray)
使QBuffer使用由byteArray指向的QByteArray作为其内部缓冲区。调用者负责确保在QBuffer被销毁之前,或者直到调用setBuffer()更改缓冲区之前,byteArray保持有效。QBuffer不会获取QByteArray的所有权。
如果< span class="notranslate">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相同。
如果< span class="notranslate">isOpen()是真的,不执行任何操作。
void QBuffer::setData(const char *data, qsizetype size)
这是一个重载函数。
将内部缓冲区的内容设置为data的第一个size字节。
注意:在Qt 6.5之前的版本中,此函数将长度作为int
参数,可能会截断大小。
[继承虚拟]
qint64 QBuffer::size() const
[继承虚拟保护]
qint64 QBuffer::writeData(const char *data, qint64 len)
重实现:QIODevice::writeData(const char *data, qint64 maxSize)。
© 2024 The Qt Company Ltd。在此处包含的文档贡献的版权归其各自所有者所有。此处提供的文档是根据由自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt及其对应徽标是芬兰和/或其他国家的The Qt Company Ltd.的商标。所有其他商标归其各自所有者所有。