QBuffer 类

QBuffer 类提供一个 QIODevice 接口用于 QByteArray更多...

头文件 #include <QBuffer>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QIODevice

注意: 本类中所有函数都可重入

公共函数

QBuffer(QObject *parent = nullptr)
QBuffer(QByteArray *byteArray, QObject *parent = nullptr)
虚拟~QBuffer()
QByteArray &buffer()
const QByteArray &buffer() const
const QByteArray &data() const
voidsetBuffer(QByteArray *byteArray)
voidsetData(const QByteArray &data)
voidsetData(const char *data, qsizetype size)

重实现公共函数

virtual boolatEnd() const override
virtual boolcanReadLine() const override
virtual voidclose() override
virtual boolopen(QIODeviceBase::OpenMode flags) override
virtual qint64pos() const override
virtual boolseek(qint64 pos) override
virtual qint64size() const override

重实现保护函数

virtual qint64readData(char *data, qint64 len) override
virtual qint64writeData(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;

QTextStreamQDataStream 还提供了方便的构造函数,这些构造函数接受一个 QByteArray并创建一个 QBuffer,它会在幕后创建。

每次缓冲区中有新数据到达时,QBuffer 都会发出 readyRead() 信号。通过连接到此信号,你可以使用 QBuffer 在处理之前暂时存储数据。每当新数据写入缓冲区时,QBuffer 还会发出 bytesWritten() 信号。

另请参阅: QFileQDataStreamQTextStreamQByteArray

成员函数文档

[显式] 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。

另请参阅setBuffer() 和 data()。

const QByteArray &QBuffer::buffer() const

这是一个重载函数。

这与 data() 相同。

[覆盖虚函数] bool QBuffer::canReadLine() const

重新实现:QIODevice::canReadLine() const.

[覆盖虚函数] void QBuffer::close()

重新实现:QIODevice::close().

const QByteArray &QBuffer::data() const

返回缓冲区中的数据。

这与 buffer() 相同。

另请参阅setData() 和 setBuffer()。

[覆盖虚函数] 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"

如果byteArraynullptr,则缓冲区创建自己的内部QByteArray来完成工作。这个字节数组最初是空的。

另请参阅 buffer(),setData(),以及open()。

void QBuffer::setData(const QByteArray &data)

将内部缓冲区的内容设置为data。这与将data分配给buffer相同。

如果< span class="notranslate">isOpen()是真的,不执行任何操作。

另请参阅 data()和setBuffer()。

void QBuffer::setData(const char *data, qsizetype size)

这是一个重载函数。

将内部缓冲区的内容设置为data的第一个size字节。

注意:在Qt 6.5之前的版本中,此函数将长度作为int参数,可能会截断大小。

[继承虚拟] qint64 QBuffer::size() const

重实现:QIODevice::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.的商标。所有其他商标归其各自所有者所有。