本页内容

QDataStream Class

QDataStream 类支持将二进制数据序列化为QIODevice 。更多内容...

头文件: #include <QDataStream>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QIODeviceBase

注意:该类中的所有函数均为可重入的。

公共类型

enum ByteOrder { BigEndian, LittleEndian }
enum FloatingPointPrecision { SinglePrecision, DoublePrecision }
enum Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed, SizeLimitExceeded }
enum Version { Qt_1_0, Qt_2_0, Qt_2_1, Qt_3_0, Qt_3_1, …, Qt_6_12 }

公共函数

QDataStream()
QDataStream(QIODevice *d)
QDataStream(const QByteArray &a)
QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)
~QDataStream()
void abortTransaction()
bool atEnd() const
QDataStream::ByteOrder byteOrder() const
bool commitTransaction()
QIODevice *device() const
QDataStream::FloatingPointPrecision floatingPointPrecision() const
(since 6.7) QDataStream &readBytes(char *&s, qint64 &l)
qint64 readRawData(char *s, qint64 len)
void resetStatus()
void rollbackTransaction()
void setByteOrder(QDataStream::ByteOrder bo)
void setDevice(QIODevice *d)
void setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)
void setStatus(QDataStream::Status status)
void setVersion(int v)
qint64 skipRawData(qint64 len)
void startTransaction()
QDataStream::Status status() const
int version() const
QDataStream &writeBytes(const char *s, qint64 len)
qint64 writeRawData(const char *s, qint64 len)
(since 6.10) operator bool() const
QDataStream &operator<<(qint8 i)
QDataStream &operator<<(bool i)
(since 6.0) QDataStream &operator<<(char16_t c)
(since 6.0) QDataStream &operator<<(char32_t c)
QDataStream &operator<<(const char *s)
QDataStream &operator<<(double f)
QDataStream &operator<<(float f)
QDataStream &operator<<(qint16 i)
QDataStream &operator<<(qint32 i)
QDataStream &operator<<(qint64 i)
QDataStream &operator<<(quint16 i)
QDataStream &operator<<(quint32 i)
QDataStream &operator<<(quint64 i)
QDataStream &operator<<(quint8 i)
QDataStream &operator<<(std::nullptr_t ptr)
QDataStream &operator>>(bool &i)
QDataStream &operator>>(qint8 &i)
QDataStream &operator>>(char *&s)
(since 6.0) QDataStream &operator>>(char16_t &c)
(since 6.0) QDataStream &operator>>(char32_t &c)
QDataStream &operator>>(double &f)
QDataStream &operator>>(float &f)
QDataStream &operator>>(qint16 &i)
QDataStream &operator>>(qint32 &i)
QDataStream &operator>>(qint64 &i)
QDataStream &operator>>(quint16 &i)
QDataStream &operator>>(quint32 &i)
QDataStream &operator>>(quint64 &i)
QDataStream &operator>>(quint8 &i)
QDataStream &operator>>(std::nullptr_t &ptr)
(since 6.0) QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)
QDataStream &operator<<(QDataStream &ds, qfloat16 f)
QDataStream &operator>>(QDataStream &ds, qfloat16 &f)
(since 6.0) QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

详细说明

数据流是一种经过编码的信息二进制流,它与主机计算机的操作系统、CPU 或字节序完全无关。例如,由运行 Windows 系统的 PC 写入的数据流,可以被运行 Solaris 系统的 Sun SPARC 计算机读取。

您还可以使用数据流来读写raw unencoded binary data 。如果您需要一个“解析”输入流,请参阅QTextStream 。

QDataStream 类实现了 C++ 基本数据类型的序列化,例如char 、short 、int 、char * 等。更复杂数据的序列化是通过将数据拆分为基本单元来实现的。

数据流与QIODevice 紧密协作。QIODevice 代表一种可读写数据的输入/输出介质。QFile 类就是一种I/O设备的示例。

示例(将二进制数据写入流):

QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);   // we will serialize the data into the file
out << QString("the answer is");   // serialize a string
out << (qint32)42;        // serialize an integer

示例(从流中读取二进制数据):

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;           // extract "the answer is" and 42

QBrush 、QColor 、QDateTime 、QFont 、QPixmap 、QString 、QVariant 等众多类型。有关支持数据流的所有 Qt 类型的完整列表,请参阅《Qt 数据类型的序列化》。

对于整数,最好在写入时始终将其强制转换为 Qt 整数类型,并在读取时将其还原为相同的 Qt 整数类型。这可确保您获得所需大小的整数,并避免受编译器和平台差异的影响。

枚举类型可通过 QDataStream 进行序列化,无需手动定义流式操作符。枚举类将根据声明的大小进行序列化。

初始的 I/O 设备通常在构造函数中设置,但可以通过 `setDevice()` 进行更改。如果已到达数据末尾(或者未设置 I/O 设备),则 `atEnd()` 将返回 true。

容器和字符串的序列化

序列化格式为:首先是一个长度标识符,随后是l 字节的数据。如果版本低于6.7,或者元素个数小于0xfffffffe(2^32 - 2),则长度标识符为一个quint32。 否则,将包含一个扩展值 0xfffffffe,后跟一个包含实际值的 quint64。此外,对于支持 isNull() 的容器,其编码形式为一个所有位均设为 1 且不包含数据的单个 quint32。

举例来说,如果字符串长度可容纳在 32 位内,则一个char * 的字符串会被写为一个 32 位整数,该整数等于字符串的长度(包括 '\0' 字节),随后是字符串中的所有字符(包括 '\0' 字节)。 如果字符串大小大于 32 位,则先写入值 0xffffffffe 作为扩展大小的标记,随后写入 64 位的实际大小。 读取char * 字符串时,首先读取 4 字节。如果该值不等于 0xffffffffe(扩展长度的标记),则将这 4 字节视为字符串的 32 位长度。 否则,将读取接下来的8字节,并将其视为字符串的64位长度。随后,将读取char * 字符串中的所有字符,包括终止符“\0 ”。

版本控制

自 Qt 1.0 以来,QDataStream 的二进制格式一直在演变,并且很可能会继续演变以反映 Qt 中的变更。在输入或输出复杂类型时,务必确保读写时使用同一版本的流(version())。 如果您需要向前和向后兼容性,可以在应用程序中硬编码版本号:

stream.setVersion(QDataStream::Qt_4_0);

如果您正在创建一种新的二进制数据格式(例如,由您的应用程序生成的文档文件格式),可以使用 QDataStream 将数据写入可移植的格式中。通常,您会编写一个简短的头信息,其中包含魔数和版本号,以便为未来的扩展预留空间。例如:

QFile file("file.xxx");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);

// Write a header with a "magic number" and a version
out << (quint32)0xA0B0C0D0;
out << (qint32)123;

out.setVersion(QDataStream::Qt_4_0);

// Write the data
out << lots_of_interesting_data;

然后使用以下代码读取该数据:

QFile file("file.xxx");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);

// Read and check the header
quint32 magic;
in >> magic;
if (magic != 0xA0B0C0D0)
    return XXX_BAD_FILE_FORMAT;

// Read the version
qint32 version;
in >> version;
if (version < 100)
    return XXX_BAD_FILE_TOO_OLD;
if (version > 123)
    return XXX_BAD_FILE_TOO_NEW;

if (version <= 110)
    in.setVersion(QDataStream::Qt_3_1);
else
    in.setVersion(QDataStream::Qt_4_0);

// Read the data
in >> lots_of_interesting_data;
if (version >= 120)
    in >> data_new_in_XXX_version_1_2;
in >> other_interesting_data;

在序列化数据时,您可以选择使用哪种字节序。默认设置为大端序(最高字节在前)。将其更改为小端序会破坏可移植性(除非读取端也改为小端序)。除非您有特殊要求,否则建议保持此设置。

读取和写入原始二进制数据

您可能希望直接从数据流中读取或向数据流写入自定义的原始二进制数据。可以使用 `readRawData()` 将数据从流读取到预先分配的 `char * ` 中。同样,可以使用 `writeRawData()` 将数据写入流中。请注意,数据的任何编码/解码操作都必须由您自行完成。

另一对类似的函数是readBytes() 和writeBytes()。它们与相应的原始函数的区别如下:readBytes() 读取一个 quint32 值,该值被视为要读取的数据的长度,然后将相应数量的字节读入预先分配的char * 中;writeBytes() 写入一个包含数据长度的 quint32 值,随后写入数据。 请注意,除长度 quint32 之外,任何数据的编码/解码工作都必须由您自行完成。

Qt 集合类的读写操作

Qt 容器类也可以序列化到 QDataStream 中。这些类包括QList 、QSet 、QHash 和QMap 。流运算符被声明为这些类的非成员。

读取和写入其他 Qt 类

除了本文档中记录的重载流运算符外,任何您可能希望序列化到 QDataStream 的 Qt 类,都会声明相应的流运算符,且这些运算符均为该类的非成员:

QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);

例如,以下是作为QImage 类非成员声明的流运算符:

QDataStream &operator<<(QDataStream &stream, const QImage &image);
QDataStream &operator>>(QDataStream &stream, QImage &image);

若要查看您常用的 Qt 类是否定义了类似的流运算符,请查阅该类文档页面中的“相关非成员”部分。

使用读取事务

当数据流在异步设备上运行时,数据块可能会在任意时间点到达。 QDataStream 类实现了一种事务机制,该机制允许通过一系列流运算符以原子方式读取数据。例如,您可以通过在连接到 readyRead() 信号的槽中使用事务,来处理来自套接字的不完整读取:

in.startTransaction();
QString str;
qint32 a;
in >> str >> a; // try to read packet atomically

if (!in.commitTransaction())
    return;     // wait for more data

如果未收到完整数据包,该代码会将流恢复到初始位置,之后需要等待更多数据到达。

数据损坏与安全性

QDataStream 无法容忍数据输入损坏,因此不应将其用于对安全性要求较高的场景,即使使用事务也是如此。事务有助于判断当前可用的数据是否足以在异步设备上解码一个有效的输入,但会假设可用的数据格式正确。

此外,许多 QDataStream 反序列化运算符会根据流中找到的信息分配内存。这些运算符不会验证所请求的内存量是否合理,也不会验证其是否与流中可用数据的量相兼容(例如:对QByteArray 或QString 进行反序列化时,可能会出现请求分配数吉字节内存的情况)。

不应将 QDataStream 用于来源不可信的内容。应用程序的设计应确保仅尝试解码那些来源可信度至少与应用程序本身或其插件相当的数据流。

另请参阅 QTextStream 和QVariant 。

成员类型文档

enum QDataStream::ByteOrder

用于读写数据的字节顺序。

常量值描述
QDataStream::BigEndianQSysInfo::BigEndian最高有效字节优先(默认)
QDataStream::LittleEndianQSysInfo::LittleEndian最低有效字节优先

enum QDataStream::FloatingPointPrecision

用于读写数据的浮点数的精度。此设置仅在数据流版本为Qt_4_6 或更高时生效。

警告: 在写入数据流的对象和读取数据流的对象上,浮点精度 必须设置为相同的值。

常量值描述
QDataStream::SinglePrecision0数据流中的所有浮点数均具有 32 位精度。
QDataStream::DoublePrecision1数据流中的所有浮点数均具有 64 位精度。

另请参阅 setFloatingPointPrecision() 和floatingPointPrecision()。

enum QDataStream::Status

此枚举描述了数据流的当前状态。

常量值描述
QDataStream::Ok0数据流运行正常。
QDataStream::ReadPastEnd1数据流已读取到底层设备中数据的末尾之后。
QDataStream::ReadCorruptData2数据流读取到了损坏的数据。
QDataStream::WriteFailed3数据流无法向底层设备写入数据。
QDataStream::SizeLimitExceeded (since Qt 6.7)4数据流无法读取或写入数据,因为其大小超出了当前平台的支持范围。例如,在 32 位平台上尝试读取超过 2 GiB 的数据时,就会发生这种情况。

enum QDataStream::Version

该枚举为数据序列化格式的版本号提供了符号别名。

常量值
QDataStream::Qt_1_01
QDataStream::Qt_2_02
QDataStream::Qt_2_13
QDataStream::Qt_3_04
QDataStream::Qt_3_15
QDataStream::Qt_3_36
QDataStream::Qt_4_07
QDataStream::Qt_4_1Qt_4_0
QDataStream::Qt_4_28
QDataStream::Qt_4_39
QDataStream::Qt_4_410
QDataStream::Qt_4_511
QDataStream::Qt_4_612
QDataStream::Qt_4_7Qt_4_6
QDataStream::Qt_4_8Qt_4_7
QDataStream::Qt_4_9Qt_4_8
QDataStream::Qt_5_013
QDataStream::Qt_5_114
QDataStream::Qt_5_215
QDataStream::Qt_5_3Qt_5_2
QDataStream::Qt_5_416
QDataStream::Qt_5_5Qt_5_4
QDataStream::Qt_5_617
QDataStream::Qt_5_7Qt_5_6
QDataStream::Qt_5_8Qt_5_7
QDataStream::Qt_5_9Qt_5_8
QDataStream::Qt_5_10Qt_5_9
QDataStream::Qt_5_11Qt_5_10
QDataStream::Qt_5_1218
QDataStream::Qt_5_1319
QDataStream::Qt_5_14Qt_5_13
QDataStream::Qt_5_15Qt_5_14
QDataStream::Qt_6_020
QDataStream::Qt_6_1Qt_6_0
QDataStream::Qt_6_2Qt_6_0
QDataStream::Qt_6_3Qt_6_0
QDataStream::Qt_6_4Qt_6_0
QDataStream::Qt_6_5Qt_6_0
QDataStream::Qt_6_621
QDataStream::Qt_6_722
QDataStream::Qt_6_8Qt_6_7
QDataStream::Qt_6_9Qt_6_7
QDataStream::Qt_6_1023
QDataStream::Qt_6_1124
QDataStream::Qt_6_12Qt_6_11

另请参阅 setVersion() 和version()。

成员函数文档

QDataStream::QDataStream()

构建一个不包含 I/O 设备的数据流。

另请参阅 setDevice()。

[explicit] QDataStream::QDataStream(QIODevice *d)

构建一个使用 I/O 设备d 的数据流。

另请参阅 setDevice() 和device()。

QDataStream::QDataStream(const QByteArray &a)

构建一个基于字节数组 `a` 的只读数据流。若需向字节数组写入数据,请使用 `QDataStream(QByteArray*, int)`。

由于QByteArray 不是QIODevice 的子类,因此系统会在内部创建一个QBuffer 来封装该字节数组。

QDataStream::QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)

构建一个对字节数组a 进行操作的数据流。mode 描述了该设备的使用方式。

此外,若您仅需从字节数组中读取数据,也可使用 QDataStream(constQByteArray &)。

由于QByteArray 并非QIODevice 的子类,因此系统会在内部创建一个QBuffer 来封装该字节数组。

[noexcept] QDataStream::~QDataStream()

销毁数据流。

该析构函数不会影响当前的 I/O 设备,除非该设备是正在处理构造函数中传入的 `QByteArray ` 的内部 I/O 设备(例如 `QBuffer`),在这种情况下,该内部 I/O 设备将被销毁。

void QDataStream::abortTransaction()

中止读取事务。

该函数通常用于在发生更高层协议错误或流同步丢失后丢弃事务。

如果在内部事务上调用此函数,则中止操作将委托给最外层的事务,并且随后启动的内部事务将被迫失败。

对于最外层事务,将丢弃恢复点以及流中任何内部复制的数据。不会影响流的当前读取位置。

将数据流的状态设置为

Constant描述
ReadCorruptData。

另请参阅 startTransaction()、commitTransaction() 和rollbackTransaction()。

bool QDataStream::atEnd() const

如果 I/O 设备已到达末尾(流或文件的末尾)或未设置 I/O 设备,则返回true ;否则返回false 。

另请参阅 QIODevice::atEnd()。

QDataStream::ByteOrder QDataStream::byteOrder() const

返回当前的字节序设置——BigEndian 或LittleEndian 之一。

另请参阅 setByteOrder()。

bool QDataStream::commitTransaction()

完成一次读取事务。如果事务期间未发生读取错误,则返回true ;否则返回false 。

如果在内部事务中调用此函数,提交操作将被推迟,直到最外层的 commitTransaction()、rollbackTransaction() 或abortTransaction() 调用发生时才执行。

否则,如果流状态表明已读到数据末尾之后,该函数将流数据恢复到调用startTransaction() 时的位置。 当出现这种情况时,您需要等待更多数据到达,之后再开始一个新的事务。如果数据流读取了损坏的数据,或者任何内部事务被中止,则该函数将中止当前事务。

另请参阅 startTransaction()、rollbackTransaction() 和abortTransaction()。

QIODevice *QDataStream::device() const

返回当前设置的 I/O 设备;如果当前未设置任何设备,则返回 `nullptr `。

另请参阅 setDevice()。

QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const

返回数据流的浮点精度。

另请参阅 FloatingPointPrecision 和setFloatingPointPrecision()。

[since 6.7] QDataStream &QDataStream::readBytes(char *&s, qint64 &l)

从流中读取缓冲区s ,并返回对该流的引用。

缓冲区s 使用new [] 分配。请使用delete [] 运算符将其销毁。

l 参数被设置为缓冲区的长度。如果读取的字符串为空,则l 被设置为 0,s 被设置为nullptr 。

序列化格式为:首先是长度指定符,随后是l 字节的数据。 如果版本小于 6.7 或元素个数小于 0xfffffffe (2^32 - 2),则长度指定符为一个 quint32;否则,先有一个扩展值 0xfffffffe,后跟一个包含实际值的 quint64。 此外,对于支持 isNull() 的容器,其编码形式为一个所有位均设为 1 且不包含数据的单个 quint32。

该函数在 Qt 6.7 中引入。

另请参阅 readRawData() 和writeBytes()。

qint64 QDataStream::readRawData(char *s, qint64 len)

从流中最多读取len 字节数据到s ,并返回读取的字节数。如果发生错误,该函数返回 -1。

缓冲区s 必须预先分配。数据不会被解码。

另请参阅 readBytes()、QIODevice::read(),以及writeRawData()。

void QDataStream::resetStatus()

重置数据流的状态。

另请参阅 Status 、status() 以及setStatus()。

void QDataStream::rollbackTransaction()

回滚一个读取事务。

当在提交事务之前检测到未完成的读取时,通常使用此函数来回滚事务。

如果对内部事务调用此函数,回滚操作将委托给最外层的事务,并且随后启动的内部事务将被迫失败。

对于最外层事务,将流数据恢复到调用 `startTransaction()` 时的状态。如果数据流读取了损坏的数据,或者任何内层事务被中止,则此函数将中止该事务。

如果之前的流操作成功,则将数据流的状态设置为

Constant描述
ReadPastEnd。

另请参阅 startTransaction()、commitTransaction() 和abortTransaction()。

void QDataStream::setByteOrder(QDataStream::ByteOrder bo)

将序列化字节顺序设置为bo 。

bo 参数可以是QDataStream::BigEndian 或QDataStream::LittleEndian 。

默认设置为大端字节序。除非有特殊要求,否则建议保留此设置。

另请参阅 byteOrder()。

void QDataStream::setDevice(QIODevice *d)

void QDataStream::setDevice(QIODevice *d)

将 I/O 设备设置为d ,其中nullptr 可用于取消设置当前 I/O 设备。

另请参阅 device()。

void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)

将数据流的浮点精度设置为precision 。如果浮点精度为DoublePrecision ,且数据流版本为Qt_4_6 或更高,则所有浮点数都将以64位精度进行读写。 如果浮点精度为SinglePrecision ,且版本为Qt_4_6 或更高,则所有浮点数都将以 32 位精度进行读写。

对于Qt_4_6 之前的版本,数据流中浮点数的精度取决于调用的流操作符。

默认值为DoublePrecision 。

请注意,此属性不会影响qfloat16 实例的序列化或反序列化。

警告: 在写入数据流的对象和读取数据流的对象上,此 属性必须设置为相同的值。

另请参阅 floatingPointPrecision()。

void QDataStream::setStatus(QDataStream::Status status)

将数据流的状态设置为给定的status 。

在调用resetStatus() 之前,后续对 setStatus() 的调用将被忽略。

另请参阅 Status 、status() 和resetStatus()。

void QDataStream::setVersion(int v)

将数据序列化格式的版本号设置为v ,该值属于Version 枚举。

如果您使用的是 Qt 的当前版本,则无需设置版本号,但对于您自己的自定义二进制格式,我们建议您进行设置;请参阅“详细说明”中的Versioning 。

为了适应新功能,某些 Qt 类的数据流序列化格式在某些 Qt 版本中发生了变化。 如果您想读取由早期版本的 Qt XML 生成的数据,或者写入可被使用早期版本的 Qt XML 编译的程序读取的数据,请使用此函数来修改QDataStream 所使用的序列化格式。

Version 枚举为不同版本的 Qt 提供了符号常量。例如:

QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_0);

另请参阅 version() 和Version 。

qint64 QDataStream::skipRawData(qint64 len)

从设备中跳过len 字节。返回实际跳过的字节数;若发生错误,则返回 -1。

这相当于对长度为len 的缓冲区调用readRawData(),并忽略该缓冲区。

另请参见 QIODevice::seek()。

void QDataStream::startTransaction()

在流上启动一个新的读取事务。

在读取操作序列中定义一个可恢复点。对于顺序设备,读取数据将在内部被复制,以便在读取不完整时进行恢复。对于随机访问设备,此函数会保存流的当前位置。调用commitTransaction()、rollbackTransaction() 或abortTransaction() 来结束当前事务。

一旦事务启动,后续对该函数的调用将使事务成为递归事务。内部事务作为最外层事务的代理(即向最外层事务报告读取操作的状态,从而使最外层事务能够恢复流的位置)。

注意: 不支持恢复 到嵌套的 startTransaction() 调用点。

当事务期间发生错误(包括内部事务失败)时,数据流的读取将暂停(所有后续读取操作均返回空值或零值),且后续的内部事务将强制失败。启动一个新的最外层事务可从该状态恢复。这种行为使得无需对每个读取操作单独进行错误检查。

另请参阅 commitTransaction()、rollbackTransaction() 和abortTransaction()。

QDataStream::Status QDataStream::status() const

返回数据流的状态。

另请参阅 Status 、setStatus() 以及resetStatus()。

int QDataStream::version() const

返回数据序列化格式的版本号。

另请参阅 setVersion() 和Version 。

QDataStream &QDataStream::writeBytes(const char *s, qint64 len)

将长度限定符 `len ` 和缓冲区 `s ` 写入流,并返回该流的引用。

len 将被序列化为一个 quint32 值和一个可选的 quint64 值,随后是来自s 的len 字节数据。请注意,数据未经过编码。

另请参阅 writeRawData() 和readBytes()。

qint64 QDataStream::writeRawData(const char *s, qint64 len)

将s 中的len 字节写入流中。返回实际写入的字节数;若发生错误,则返回 -1。数据未经过编码。

另请参阅 writeBytes()、QIODevice::write() 和readRawData()。

[explicit noexcept, since 6.10] QDataStream::operator bool() const

返回该流是否无错误(status() 返回Ok )。

该函数在 Qt 6.10 中引入。

QDataStream &QDataStream::operator<<(qint8 i)

将一个带符号的字节(i )写入流中,并返回该流的引用。

QDataStream &QDataStream::operator<<(bool i)

将布尔值i 写入流中。返回对该流的引用。

这是一个重载函数。

[since 6.0] QDataStream &QDataStream::operator<<(char16_t c)

将字符c 写入流中。返回对该流的引用

这是一个重载函数。

该函数在 Qt 6.0 中引入。

[since 6.0] QDataStream &QDataStream::operator<<(char32_t c)

将字符c 写入流中。返回对该流的引用

这是一个重载函数。

该函数在 Qt 6.0 中引入。

QDataStream &QDataStream::operator<<(const char *s)

将以“\0 ”结尾的字符串s 写入流,并返回该流的引用。

该字符串使用writeBytes() 进行序列化。

这是一个重载函数。

另请参阅 writeBytes() 和writeRawData()。

QDataStream &QDataStream::operator<<(double f)

将浮点数f 按标准IEEE 754格式写入流中。返回对该流的引用。

这是一个重载函数。

另请参阅 setFloatingPointPrecision()。

QDataStream &QDataStream::operator<<(float f)

将浮点数f 按标准IEEE 754格式写入流中。返回对该流的引用。

这是一个重载函数。

另请参阅 setFloatingPointPrecision()。

QDataStream &QDataStream::operator<<(qint16 i)

将一个有符号的 16 位整数(i )写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(qint32 i)

将一个有符号的 32 位整数i 写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(qint64 i)

将一个有符号的 64 位整数(i )写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(quint16 i)

将一个无符号 16 位整数i 写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(quint32 i)

将一个无符号整数i 作为32位无符号整数(quint32)写入流中。返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(quint64 i)

将一个无符号 64 位整数i 写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(quint8 i)

将一个无符号字节(i )写入流,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator<<(std::nullptr_t ptr)

模拟将std::nullptr_t (ptr )写入流,并返回该流的引用。该函数实际上并未向流中写入任何内容,因为std::nullptr_t 的值会被存储为0字节。

这是一个重载函数。

QDataStream &QDataStream::operator>>(bool &i)

从流中读取一个布尔值并将其赋值给i 。返回对该流的引用。

QDataStream &QDataStream::operator>>(qint8 &i)

从流中读取一个带符号的字节并将其赋值给i ,并返回对该流的引用。

QDataStream &QDataStream::operator>>(char *&s)

从流中读取字符串s ,并返回对该流的引用。

该字符串使用readBytes() 进行反序列化,其序列化格式为:首先是quint32 长度指定符,随后是相应数量字节的数据。生成的字符串始终以 '\0' 结尾。

字符串的内存空间通过 `new [] ` 分配——调用方必须使用 `delete []` 将其销毁。

这是一个重载函数。

另请参阅 readBytes() 和readRawData()。

[since 6.0] QDataStream &QDataStream::operator>>(char16_t &c)

从流中读取一个16位宽的字符到c 中,并返回该流的引用。

这是一个重载函数。

该函数在 Qt 6.0 中引入。

[since 6.0] QDataStream &QDataStream::operator>>(char32_t &c)

从流中读取一个32位宽的字符到c 中,并返回对该流的引用。

这是一个重载函数。

该函数在 Qt 6.0 中引入。

QDataStream &QDataStream::operator>>(double &f)

从流中读取一个浮点数并将其赋值给f ,采用标准IEEE 754格式。返回对该流的引用。

这是一个重载函数。

另请参阅 setFloatingPointPrecision()。

QDataStream &QDataStream::operator>>(float &f)

从流中读取一个浮点数并将其赋值给f ,采用标准IEEE 754格式。返回对该流的引用。

这是一个重载函数。

另请参阅 setFloatingPointPrecision()。

QDataStream &QDataStream::operator>>(qint16 &i)

从流中读取一个有符号的 16 位整数并将其赋值给 `i`,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(qint32 &i)

从流中读取一个有符号的 32 位整数并将其赋值给 `i`,并返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(qint64 &i)

从流中读取一个有符号的 64 位整数并将其赋值给 `i`,并返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(quint16 &i)

从流中读取一个无符号 16 位整数并将其赋值给 `i`,并返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(quint32 &i)

从流中读取一个无符号 32 位整数并将其赋值给 `i`,并返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(quint64 &i)

从流中读取一个无符号 64 位整数,将其赋值给 `i`,并返回该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(quint8 &i)

从流中读取一个无符号字节到i 中,并返回对该流的引用。

这是一个重载函数。

QDataStream &QDataStream::operator>>(std::nullptr_t &ptr)

模拟从流中读取std::nullptr_t 并将其写入ptr ,并返回对该流的引用。该函数实际上并未从流中读取任何内容,因为std::nullptr_t 的值被存储为0字节。

这是一个重载函数。

相关的非成员函数

[since 6.0] template <typename T1, typename T2> QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)

将数对 `pair ` 写入流 `out`。

该函数要求类型 T1 和 T2 实现operator<<() 接口。

该函数在 Qt 6.0 中引入。

另请参阅 《Qt 数据类型的序列化》。

QDataStream &operator<<(QDataStream &ds, qfloat16 f)

将浮点数 `f` 按标准 IEEE 754 格式写入流 `ds `。返回对该流的引用。

注意:在 Qt 6.3 之前的版本中,此函数是QDataStream 上的成员函数。

QDataStream &operator>>(QDataStream &ds, qfloat16 &f)

从流ds 中读取一个浮点数并将其赋值给f ,采用标准IEEE 754格式。返回该流的引用。

注意:在 Qt 6.3 之前的版本中,这是QDataStream 上的一个成员函数。

[since 6.0] template <typename T1, typename T2> QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

从流in 中读取一对数据,并将其存入pair 中。

此函数要求类型 T1 和 T2 实现operator>>() 接口。

该函数在 Qt 6.0 中引入。

另请参阅 《Qt 数据类型的序列化》。

© 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.