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_9 }

公共函数

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)
(until 6.11) QDataStream &readBytes(char *&s, uint &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)
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)
(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

写入数据流的每个项目都以预定义的二进制格式写入,该格式因项目类型而异。支持的 Qt XML 类型包括QBrush,QColor,QDateTime,QFont,QPixmap,QString,QVariant 等。有关支持数据流的所有 Qt 类型的完整列表,请参阅序列化 Qt 数据类型

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

枚举可通过 QDataStream 进行序列化,而无需手动定义流操作符。枚举类使用声明的大小进行序列化。

初始 I/O 设备通常在构造函数中设置,但也可以通过setDevice() 进行更改。如果数据已经结束(或没有设置 I/O 设备),atEnd() 将返回 true。

序列化容器和字符串

序列化格式是先指定长度,然后是l 字节的数据。如果版本小于 6.7 或元素数小于 0xfffffffffe(2^32 -2),长度指定符就是一个 quint32。否则,会有一个扩展值 0xfffffffe,然后是一个包含实际值的 quint64。此外,对于支持 isNull() 的容器,它被编码为一个所有位都已设置且无数据的 quint32。

举个例子,如果字符串大小适合 32 位,那么char * 字符串会被写成一个 32 位整数,等于字符串长度(包括"\0 "字节),后面是字符串的所有字符(包括"\0 "字节)。如果字符串的大小更大,则会写入 0xffffffffffe 作为扩展大小的标记,然后写入 64 位实际大小。读取char * 字符串时,首先读取 4 个字节。如果值不等于 0xffffffffffe(扩展大小标记),那么这 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_2);
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;

您可以选择序列化数据时使用的字节顺序。默认设置是 big-endian(MSB 在前)。将其更改为小端(little-endian)会破坏数据的可移植性(除非读取器也更改为小端)。除非有特殊要求,否则我们建议保留这一设置。

读写原始二进制数据

您可能希望直接从数据流中读取/写入自己的原始二进制数据。可以使用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 解分档操作符会根据流中的信息分配内存。这些操作符不会验证所请求的内存量是否合理,或是否与流中可用的数据量相匹配(例如:对QByteArrayQString 进行解分档时,可能会看到分配几千兆字节数据的请求)。

QDataStream 不适用于来源不可信的内容。在设计应用程序时,应尽量只对其来源至少与应用程序本身或其插件的来源同样可信的数据流进行解码。

另请参阅 QTextStreamQVariant

成员类型文档

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版本 1(Qt 1.x)
QDataStream::Qt_2_02版本 2(Qt 2.0)
QDataStream::Qt_2_13版本 3(Qt 2.1、2.2、2.3)
QDataStream::Qt_3_04版本 4(Qt 3.0)
QDataStream::Qt_3_15版本 5(Qt 3.1、3.2)
QDataStream::Qt_3_36版本 6(Qt 3.3)
QDataStream::Qt_4_07版本 7(Qt 4.0、Qt 4.1)
QDataStream::Qt_4_1Qt_4_0版本 7(Qt 4.0、Qt 4.1)
QDataStream::Qt_4_28版本 8(Qt 4.2)
QDataStream::Qt_4_39版本 9(Qt 4.3)
QDataStream::Qt_4_410版本 10(Qt 4.4)
QDataStream::Qt_4_511版本 11(Qt 4.5)
QDataStream::Qt_4_612版本 12(Qt 4.6、Qt 4.7、Qt 4.8)
QDataStream::Qt_4_7Qt_4_6与 Qt_4_6 相同。
QDataStream::Qt_4_8Qt_4_7与 Qt_4_6 相同。
QDataStream::Qt_4_9Qt_4_8与 Qt_4_6 相同。
QDataStream::Qt_5_013版本 13 (Qt 5.0)
QDataStream::Qt_5_114版本 14 (Qt 5.1)
QDataStream::Qt_5_215版本 15 (Qt 5.2)
QDataStream::Qt_5_3Qt_5_2与 Qt_5_2 相同
QDataStream::Qt_5_416版本 16 (Qt 5.4)
QDataStream::Qt_5_5Qt_5_4与 Qt_5_4 相同
QDataStream::Qt_5_617版本 17 (Qt 5.6)
QDataStream::Qt_5_7Qt_5_6与 Qt_5_6 相同
QDataStream::Qt_5_8Qt_5_7与 Qt_5_6 相同
QDataStream::Qt_5_9Qt_5_8与 Qt_5_6 相同
QDataStream::Qt_5_10Qt_5_9与 Qt_5_6 相同
QDataStream::Qt_5_11Qt_5_10与 Qt_5_6 相同
QDataStream::Qt_5_1218版本 18 (Qt 5.12)
QDataStream::Qt_5_1319版本 19 (Qt 5.13)
QDataStream::Qt_5_14Qt_5_13与 Qt_5_13 相同
QDataStream::Qt_5_15Qt_5_14与 Qt_5_13 相同
QDataStream::Qt_6_020版本 20 (Qt 6.0)
QDataStream::Qt_6_1Qt_6_0与 Qt_6_0 相同
QDataStream::Qt_6_2Qt_6_0与 Qt_6_0 相同
QDataStream::Qt_6_3Qt_6_0与 Qt_6_0 相同
QDataStream::Qt_6_4Qt_6_0与 Qt_6_0 相同
QDataStream::Qt_6_5Qt_6_0与 Qt_6_0 相同
QDataStream::Qt_6_621版本 21 (Qt 6.6)
QDataStream::Qt_6_722版本 22 (Qt 6.7)
QDataStream::Qt_6_8Qt_6_7与 Qt_6_7 相同
QDataStream::Qt_6_9Qt_6_7与 Qt_6_7 相同

另请参阅 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 设备,除非它是一个内部 I/O 设备(例如QBuffer ),正在处理构造函数中传递的QByteArray ,在这种情况下,内部 I/O 设备将被销毁。

void QDataStream::abortTransaction()

终止读取事务。

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

如果在内部事务中调用,则会委托最外层事务中止,随后启动的内部事务将被迫失败。

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

将数据流的状态设置为

常量说明
ReadCorruptData.

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

bool QDataStream::atEnd() const

如果 I/O 设备已到达结束位置(数据流或文件的结束位置)或未设置 I/O 设备,则返回true ;否则返回false

另请参阅 QIODevice::atEnd() 。

QDataStream::ByteOrder QDataStream::byteOrder() const

返回当前字节序设置 -BigEndianLittleEndian

另请参阅 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

返回数据流的浮点精度。

另请参阅 FloatingPointPrecisionsetFloatingPointPrecision()。

[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() 的容器,它被编码为一个所有位都已设置且无数据的 quint32。

该函数在 Qt 6.7 中引入。

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

[until 6.11] QDataStream &QDataStream::readBytes(char *&s, uint &l)

该函数将在 6.11 版中被废弃。

请使用长度为 qint64 的重载函数。

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() 时的位置。如果数据流已读取损坏的数据,或任何内部事务已中止,则该函数会中止事务。

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

常量说明
ReadPastEnd.

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

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

将序列化字节顺序设为bo

bo 参数可以是QDataStream::BigEndianQDataStream::LittleEndian

默认设置为 big-endian。除非有特殊要求,否则建议保留此设置。

另请参阅 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() 的后续调用将被忽略。

另请参阅 Statusstatus() 和resetStatus()。

void QDataStream::setVersion(int v)

将数据序列化格式的版本号设置为v ,即Version 枚举的一个值。

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

为了适应新功能,某些 Qt 类的数据流序列化格式在某些 Qt 版本中发生了变化。如果您想读取 Qt 早期版本创建的数据,或写入可被 Qt 早期版本编译的程序读取的数据,请使用此函数修改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,之后是来自slen 字节。请注意,数据编码。

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

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

len 字节从s 写入数据流。返回实际写入的字节数,错误时则返回-1。数据编码。

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

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)

这是一个重载函数。

使用标准 IEEE 754 格式向数据流写入浮点数f 。返回对数据流的引用。

另请参见 setFloatingPointPrecision().

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

这是一个重载函数。

使用标准 IEEE 754 格式向数据流写入浮点数f 。返回对数据流的引用。

另请参见 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)

这是一个重载函数。

使用标准 IEEE 754 格式将浮点数从数据流读入f 。返回对数据流的引用。

另请参见 setFloatingPointPrecision().

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

这是一个重载函数。

使用标准 IEEE 754 格式将浮点数从数据流读入f 。返回对数据流的引用。

另请参见 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_tptr ,并返回对数据流的引用。该函数实际上不会从数据流中读取任何内容,因为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 数据类型

[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 数据类型

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