Sur cette page

QDataStream Class

La classe QDataStream permet de sérialiser des données binaires sur un site QIODevice. Plus....

En-tête : #include <QDataStream>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérite : QIODeviceBase

Remarque : toutes les fonctions de cette classe sont réentrantes.

Types publics

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

Fonctions publiques

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)
(since 6.0) QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

Description détaillée

Un flux de données est un flux binaire d'informations codées qui est totalement indépendant du système d'exploitation de l'ordinateur hôte, de l'unité centrale ou de l'ordre des octets. Par exemple, un flux de données écrit par un PC sous Windows peut être lu par un Sun SPARC sous Solaris.

Vous pouvez également utiliser un flux de données pour lire/écrire raw unencoded binary data. Si vous souhaitez un flux d'entrée "analysant", voir QTextStream.

La classe QDataStream implémente la sérialisation des types de données de base de C++, comme char, short, int, char *, etc. La sérialisation de données plus complexes s'effectue en divisant les données en unités primitives.

Un flux de données coopère étroitement avec un QIODevice. Un QIODevice représente un support d'entrée/sortie à partir duquel il est possible de lire et d'écrire des données. La classe QFile est un exemple de périphérique d'entrée/sortie.

Exemple (écriture de données binaires dans un flux) :

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

Exemple (lecture de données binaires à partir d'un flux) :

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

Chaque élément écrit dans le flux est écrit dans un format binaire prédéfini qui varie en fonction du type de l'élément. Les types Qt pris en charge sont QBrush, QColor, QDateTime, QFont, QPixmap, QString, QVariant et bien d'autres. Pour obtenir la liste complète de tous les types Qt supportant le flux de données, voir Serializing Qt Data Types.

Pour les entiers, il est préférable de toujours utiliser un type d'entier Qt pour l'écriture et de lire le même type d'entier Qt. Cela permet d'obtenir des entiers de la taille souhaitée et de s'affranchir des différences entre les compilateurs et les plates-formes.

Les énumérations peuvent être sérialisées par l'intermédiaire de QDataStream sans qu'il soit nécessaire de définir manuellement des opérateurs de flux. Les classes d'énumérations sont sérialisées en utilisant la taille déclarée.

Le périphérique d'E/S initial est généralement défini dans le constructeur, mais il peut être modifié à l'aide de setDevice(). Si vous avez atteint la fin des données (ou si aucun périphérique d'E/S n'a été défini), atEnd() renvoie un résultat positif.

Sérialisation des conteneurs et des chaînes de caractères

Le format de sérialisation est d'abord un spécificateur de longueur, puis l octets de données. Le spécificateur de longueur est un quint32 si la version est inférieure à 6.7 ou si le nombre d'éléments est inférieur à 0xfffffffe (2^32 -2). Sinon, il y a une valeur d'extension 0xfffffffe suivie d'un quint64 avec la valeur réelle. De plus, pour les conteneurs qui supportent isNull(), il est encodé comme un simple quint32 avec tous les bits activés et aucune donnée.

Pour prendre un exemple, si la taille de la chaîne tient dans 32 bits, une chaîne char * est écrite sous la forme d'un entier de 32 bits égal à la longueur de la chaîne, y compris l'octet '\0', suivi de tous les caractères de la chaîne, y compris l'octet '\0'. Si la taille de la chaîne est supérieure, la valeur 0xffffffffe est écrite comme marqueur d'une taille étendue, suivie de 64 bits de la taille réelle. Lors de la lecture d'une chaîne char *, 4 octets sont lus en premier. Si la valeur n'est pas égale à 0xffffffffe (le marqueur de taille étendue), ces 4 octets sont traités comme la taille de 32 bits de la chaîne. Sinon, les 8 octets suivants sont lus et considérés comme la taille de 64 bits de la chaîne. Ensuite, tous les caractères de la chaîne char *, y compris le terminateur '\0', sont lus.

Version

Le format binaire de QDataStream a évolué depuis Qt 1.0, et continuera probablement à évoluer pour refléter les changements effectués dans Qt. Lors de l'entrée ou de la sortie de types complexes, il est très important de s'assurer que la même version du flux (version()) est utilisée pour la lecture et l'écriture. Si vous avez besoin d'une compatibilité ascendante et descendante, vous pouvez coder en dur le numéro de version dans l'application :

stream.setVersion(QDataStream::Qt_4_0);

Si vous produisez un nouveau format de données binaires, tel qu'un format de fichier pour les documents créés par votre application, vous pouvez utiliser un QDataStream pour écrire les données dans un format portable. En règle générale, vous écrivez un bref en-tête contenant une chaîne magique et un numéro de version afin de vous ménager une marge de manœuvre en vue d'une expansion future. Par exemple :

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;

Puis lisez-le avec :

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;

Vous pouvez sélectionner l'ordre des octets à utiliser lors de la sérialisation des données. Le réglage par défaut est big-endian (MSB en premier). Le changer en little-endian rompt la portabilité (à moins que le lecteur ne change également en little-endian). Nous vous recommandons de conserver ce paramètre, à moins que vous n'ayez des exigences particulières.

Lecture et écriture de données binaires brutes

Vous pouvez souhaiter lire/écrire vos propres données binaires brutes directement dans le flux de données. Les données peuvent être lues à partir du flux dans un espace préaffecté char * en utilisant readRawData(). De même, les données peuvent être écrites dans le flux en utilisant writeRawData(). Notez que tout encodage/décodage des données doit être effectué par vous.

Une paire de fonctions similaires est readBytes() et writeBytes(). Elles diffèrent de leurs homologues brutes de la manière suivante : readBytes() lit un quint32 qui est considéré comme la longueur des données à lire, puis ce nombre d'octets est lu dans l'espace préalloué char *; writeBytes() écrit un quint32 contenant la longueur des données, suivi des données. Notez que tout encodage/décodage des données (en dehors de la longueur quint32) doit être effectué par vous.

Lecture et écriture des classes de collection Qt

Les classes de conteneurs Qt peuvent également être sérialisées dans un QDataStream. Il s'agit notamment de QList, QSet, QHash et QMap. Les opérateurs de flux sont déclarés comme non-membres des classes.

Lecture et écriture d'autres classes Qt

En plus des opérateurs de flux surchargés documentés ici, toutes les classes Qt que vous pourriez vouloir sérialiser dans un QDataStream auront des opérateurs de flux appropriés déclarés comme non-membres de la classe :

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

Par exemple, voici les opérateurs de flux déclarés comme non-membres de la classe QImage:

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

Pour savoir si votre classe Qt préférée possède des opérateurs de flux similaires, consultez la section Related Non-Members de la page de documentation de la classe.

Utilisation des transactions de lecture

Lorsqu'un flux de données fonctionne sur un périphérique asynchrone, les morceaux de données peuvent arriver à des moments arbitraires. La classe QDataStream met en œuvre un mécanisme de transaction qui permet de lire les données de manière atomique à l'aide d'une série d'opérateurs de flux. Par exemple, vous pouvez gérer des lectures incomplètes à partir d'un socket en utilisant une transaction dans un slot connecté au signal readyRead() :

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

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

Si aucun paquet complet n'est reçu, ce code rétablit le flux à sa position initiale, après quoi il faut attendre que d'autres données arrivent.

Corruption et sécurité

QDataStream n'est pas résistant aux entrées de données corrompues et ne doit donc pas être utilisé dans des situations sensibles sur le plan de la sécurité, même en cas d'utilisation de transactions. Les transactions permettent de déterminer si une entrée valide peut être décodée avec les données actuellement disponibles sur un périphérique asynchrone, mais elles supposent que les données disponibles sont correctement formées.

En outre, de nombreux opérateurs de démarshalling de QDataStream allouent de la mémoire sur la base des informations trouvées dans le flux. Ces opérateurs ne vérifient pas si la quantité de mémoire demandée est raisonnable ou si elle est compatible avec la quantité de données disponibles dans le flux (exemple : le démarshalling d'un QByteArray ou d'un QString peut voir la demande d'allocation de plusieurs gigaoctets de données).

QDataStream ne doit pas être utilisé pour du contenu dont la provenance n'est pas fiable. Les applications doivent être conçues pour tenter de décoder uniquement les flux dont la provenance est au moins aussi fiable que celle de l'application elle-même ou de ses modules d'extension.

Voir également QTextStream et QVariant.

Documentation sur les types de membres

enum QDataStream::ByteOrder

L'ordre des octets utilisé pour la lecture/écriture des données.

ConstanteValeurDescription de l'ordre des octets
QDataStream::BigEndianQSysInfo::BigEndianOctet le plus significatif en premier (par défaut)
QDataStream::LittleEndianQSysInfo::LittleEndianOctet le moins significatif en premier

enum QDataStream::FloatingPointPrecision

La précision des nombres à virgule flottante utilisés pour lire/écrire les données. Cela n'aura d'effet que si la version du flux de données est Qt_4_6 ou supérieure.

Attention : La précision des nombres à virgule flottante doit être définie à la même valeur sur l'objet qui écrit et sur l'objet qui lit le flux de données.

ConstanteValeurDescription
QDataStream::SinglePrecision0Tous les nombres à virgule flottante du flux de données ont une précision de 32 bits.
QDataStream::DoublePrecision1Tous les nombres à virgule flottante du flux de données ont une précision de 64 bits.

Voir également setFloatingPointPrecision() et floatingPointPrecision().

enum QDataStream::Status

Cette énumération décrit l'état actuel du flux de données.

ConstanteValeurDescription du flux de données
QDataStream::Ok0Le flux de données fonctionne normalement.
QDataStream::ReadPastEnd1Le flux de données a dépassé la fin des données dans le périphérique sous-jacent.
QDataStream::ReadCorruptData2Le flux de données a lu des données corrompues.
QDataStream::WriteFailed3Le flux de données ne peut pas écrire sur le périphérique sous-jacent.
QDataStream::SizeLimitExceeded (since Qt 6.7)4Le flux de données ne peut pas lire ou écrire les données parce que leur taille est supérieure à celle prise en charge par la plate-forme actuelle. Cela peut se produire, par exemple, lorsque l'on essaie de lire plus de 2 GiB de données sur une plate-forme 32 bits.

enum QDataStream::Version

Cette énumération fournit des synonymes symboliques pour les numéros de version du format de sérialisation des données.

ConstanteValeur
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

Voir aussi setVersion() et version().

Documentation des fonctions membres

QDataStream::QDataStream()

Construit un flux de données qui n'a pas de périphérique d'entrée/sortie.

Voir aussi setDevice().

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

Construit un flux de données qui utilise le périphérique d'E/S d.

Voir également setDevice() et device().

QDataStream::QDataStream(const QByteArray &a)

Construit un flux de données en lecture seule qui opère sur un tableau d'octets a. Utilisez QDataStream(QByteArray*, int) si vous souhaitez écrire dans un tableau d'octets.

Comme QByteArray n'est pas une sous-classe de QIODevice, une QBuffer est créée en interne pour envelopper le tableau d'octets.

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

Construit un flux de données qui opère sur un tableau d'octets, a. Le site mode décrit la manière dont le périphérique doit être utilisé.

Vous pouvez également utiliser QDataStream(const QByteArray &) si vous souhaitez simplement lire un tableau d'octets.

Comme QByteArray n'est pas une sous-classe de QIODevice, une QBuffer est créée en interne pour envelopper le tableau d'octets.

[noexcept] QDataStream::~QDataStream()

Détruit le flux de données.

Le destructeur n'affecte pas le périphérique d'E/S actuel, sauf s'il s'agit d'un périphérique d'E/S interne (par exemple, un QBuffer) traitant un QByteArray transmis dans le constructeur, auquel cas le périphérique d'E/S interne est détruit.

void QDataStream::abortTransaction()

Abandonne une transaction de lecture.

Cette fonction est généralement utilisée pour abandonner la transaction après des erreurs de protocole de niveau supérieur ou une perte de synchronisation des flux.

Si elle est appelée sur une transaction interne, l'abandon est délégué à la transaction la plus externe, et les transactions internes démarrées ultérieurement sont forcées d'échouer.

Pour la transaction externe, le point de restauration et toutes les données dupliquées en interne dans le flux sont supprimés. N'affecte pas la position de lecture actuelle du flux.

Définit l'état du flux de données à

ConstanteDescription
ReadCorruptData.

Voir également startTransaction(), commitTransaction() et rollbackTransaction().

bool QDataStream::atEnd() const

Renvoie true si le périphérique d'E/S a atteint la position de fin (fin du flux ou du fichier) ou si aucun périphérique d'E/S n'est défini ; sinon, renvoie false.

Voir aussi QIODevice::atEnd().

QDataStream::ByteOrder QDataStream::byteOrder() const

Renvoie l'ordre actuel des octets - soit BigEndian ou LittleEndian.

Voir aussi setByteOrder().

bool QDataStream::commitTransaction()

Termine une transaction de lecture. Retourne true si aucune erreur de lecture ne s'est produite pendant la transaction ; sinon, retourne false.

Si elle est appelée sur une transaction interne, la validation sera reportée jusqu'à ce que l'appel commitTransaction(), rollbackTransaction() ou abortTransaction() le plus éloigné se produise.

Dans le cas contraire, si l'état du flux indique que la lecture a dépassé la fin des données, cette fonction restaure les données du flux au moment de l'appel à startTransaction(). Dans ce cas, vous devez attendre que d'autres données arrivent, après quoi vous commencez une nouvelle transaction. Si le flux de données a lu des données corrompues ou si l'une des transactions internes a été interrompue, cette fonction interrompt la transaction.

Voir également startTransaction(), rollbackTransaction() et abortTransaction().

QIODevice *QDataStream::device() const

Renvoie le périphérique d'E/S actuellement défini, ou nullptr si aucun périphérique n'est actuellement défini.

Voir aussi setDevice().

QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const

Renvoie la précision en virgule flottante du flux de données.

Voir aussi FloatingPointPrecision et setFloatingPointPrecision().

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

Lit le tampon s dans le flux et renvoie une référence au flux.

Le tampon s est alloué à l'aide de new []. Il peut être détruit à l'aide de l'opérateur delete [].

Le paramètre l correspond à la longueur du tampon. Si la chaîne lue est vide, l est mis à 0 et s est mis à nullptr.

Le format de sérialisation est un spécificateur de longueur d'abord, puis l octets de données. Le spécificateur de longueur est un quint32 si la version est inférieure à 6.7 ou si le nombre d'éléments est inférieur à 0xfffffe (2^32 -2), sinon il y a une valeur d'extension 0xfffffe suivie d'un quint64 avec la valeur réelle. De plus, pour les conteneurs qui supportent isNull(), il est encodé comme un simple quint32 avec tous les bits définis et aucune donnée.

Cette fonction a été introduite dans Qt 6.7.

Voir aussi readRawData() et writeBytes().

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

Lit au maximum len octets du flux dans s et renvoie le nombre d'octets lus. En cas d'erreur, cette fonction renvoie -1.

Le tampon s doit être pré-alloué. Les données ne sont pas décodées.

Voir aussi readBytes(), QIODevice::read() et writeRawData().

void QDataStream::resetStatus()

Réinitialise l'état du flux de données.

Voir aussi Status, status(), et setStatus().

void QDataStream::rollbackTransaction()

Annule une transaction de lecture.

Cette fonction est généralement utilisée pour annuler la transaction lorsqu'une lecture incomplète a été détectée avant la validation de la transaction.

Si elle est appelée sur une transaction interne, l'annulation est déléguée à la transaction externe, et les transactions internes démarrées ultérieurement sont forcées d'échouer.

Pour la transaction externe, rétablit les données du flux au point de l'appel à startTransaction(). Si le flux de données a lu des données corrompues ou si l'une des transactions internes a été interrompue, cette fonction interrompt la transaction.

Si les opérations précédentes sur le flux ont réussi, cette fonction définit l'état du flux de données à

ConstanteDescription
ReadPastEnd.

Voir également startTransaction(), commitTransaction() et abortTransaction().

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

Définit l'ordre des octets de la sérialisation à bo.

Le paramètre bo peut être QDataStream::BigEndian ou QDataStream::LittleEndian.

Le paramètre par défaut est big-endian. Nous recommandons de laisser ce paramètre à moins que vous n'ayez des exigences particulières.

Voir aussi byteOrder().

void QDataStream::setDevice(QIODevice *d)

void QDataStream::setDevice(QIODevice *d)

Définit le périphérique d'E/S à d, qui peut être nullptr pour annuler le périphérique d'E/S actuel.

Voir également device().

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

Définit la précision de la virgule flottante du flux de données à precision. Si la précision de la virgule flottante est DoublePrecision et que la version du flux de données est Qt_4_6 ou supérieure, tous les nombres à virgule flottante seront écrits et lus avec une précision de 64 bits. Si la précision de la virgule flottante est SinglePrecision et que la version est Qt_4_6 ou supérieure, tous les nombres à virgule flottante seront écrits et lus avec une précision de 32 bits.

Pour les versions antérieures à Qt_4_6, la précision des nombres à virgule flottante dans le flux de données dépend de l'opérateur de flux appelé.

La valeur par défaut est DoublePrecision.

Notez que cette propriété n'affecte pas la sérialisation ou la désérialisation des instances qfloat16.

Attention : Cette propriété doit avoir la même valeur sur l'objet qui écrit et sur l'objet qui lit le flux de données.

Voir aussi floatingPointPrecision().

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

Fixe l'état du flux de données à l'adresse status.

Les appels ultérieurs à setStatus() sont ignorés jusqu'à ce que resetStatus() soit appelé.

Voir aussi Status, status(), et resetStatus().

void QDataStream::setVersion(int v)

Définit le numéro de version du format de sérialisation des données à v, une valeur de l'énumération Version.

Vous n'avez pas besoin de définir une version si vous utilisez la version actuelle de Qt, mais pour vos propres formats binaires personnalisés, nous vous recommandons de le faire ; voir Versioning dans la description détaillée.

Pour s'adapter aux nouvelles fonctionnalités, le format de sérialisation des flux de données de certaines classes Qt a changé dans certaines versions de Qt. Si vous souhaitez lire des données créées par une version antérieure de Qt, ou écrire des données qui peuvent être lues par un programme compilé avec une version antérieure de Qt, utilisez cette fonction pour modifier le format de sérialisation utilisé par QDataStream.

L'énumération Version fournit des constantes symboliques pour les différentes versions de Qt. Par exemple :

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

Voir aussi version() et Version.

qint64 QDataStream::skipRawData(qint64 len)

Sauter len octets de l'appareil. Renvoie le nombre d'octets effectivement ignorés, ou -1 en cas d'erreur.

Cela équivaut à appeler readRawData() sur un tampon de longueur len et à ignorer le tampon.

Voir aussi QIODevice::seek().

void QDataStream::startTransaction()

Démarre une nouvelle transaction de lecture sur le flux.

Définit un point de restauration dans la séquence des opérations de lecture. Pour les périphériques séquentiels, les données lues seront dupliquées en interne pour permettre la récupération en cas de lecture incomplète. Pour les périphériques à accès aléatoire, cette fonction enregistre la position actuelle du flux. Appelez commitTransaction(), rollbackTransaction() ou abortTransaction() pour terminer la transaction en cours.

Une fois qu'une transaction est lancée, les appels ultérieurs à cette fonction rendront la transaction récursive. Les transactions internes agissent en tant qu'agents de la transaction externe (c'est-à-dire qu'elles signalent l'état des opérations de lecture à la transaction externe, qui peut rétablir la position du flux).

Remarque : la restauration au point de l'appel imbriqué startTransaction() n'est pas prise en charge.

Lorsqu'une erreur survient au cours d'une transaction (y compris l'échec d'une transaction interne), la lecture du flux de données est suspendue (toutes les opérations de lecture suivantes renvoient des valeurs vides ou nulles) et les transactions internes suivantes sont forcées d'échouer. Le démarrage d'une nouvelle transaction externe permet de sortir de cet état. Ce comportement rend inutile le contrôle d'erreur de chaque opération de lecture séparément.

Voir aussi commitTransaction(), rollbackTransaction() et abortTransaction().

QDataStream::Status QDataStream::status() const

Renvoie l'état du flux de données.

Voir aussi Status, setStatus(), et resetStatus().

int QDataStream::version() const

Renvoie le numéro de version du format de sérialisation des données.

Voir aussi setVersion() et Version.

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

Écrit le spécificateur de longueur len et le tampon s dans le flux et renvoie une référence au flux.

len est sérialisé sous la forme d'un quint32 et d'un quint64 optionnel, suivi de len octets provenant de s. Notez que les données ne sont pas encodées.

Voir aussi writeRawData() et readBytes().

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

Écrit len octets de s dans le flux. Renvoie le nombre d'octets effectivement écrits, ou -1 en cas d'erreur. Les données ne sont pas encodées.

Voir aussi writeBytes(), QIODevice::write(), et readRawData().

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

Retourne si ce flux n'a pas d'erreurs (status() retourne Ok).

Cette fonction a été introduite dans Qt 6.10.

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

Écrit un octet signé, i, dans le flux et renvoie une référence au flux.

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

Écrit une valeur booléenne, i, dans le flux. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un caractère, c, dans le flux. Renvoie une référence au flux

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

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

Écrit un caractère, c, dans le flux. Renvoie une référence au flux

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

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

Écrit la chaîne '\0'-terminée s dans le flux et renvoie une référence au flux.

La chaîne est sérialisée à l'aide de writeBytes().

Il s'agit d'une fonction surchargée.

Voir aussi writeBytes() et writeRawData().

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

Écrit un nombre à virgule flottante, f, dans le flux en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également setFloatingPointPrecision().

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

Écrit un nombre à virgule flottante, f, dans le flux en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également setFloatingPointPrecision().

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

Écrit un entier signé de 16 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un entier signé de 32 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un entier signé de 64 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un entier non signé de 16 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un entier non signé, i, dans le flux sous la forme d'un entier non signé de 32 bits (quint32). Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un entier non signé de 64 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Écrit un octet non signé, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Simule l'écriture d'un std::nullptr_t, ptr, dans le flux et renvoie une référence au flux. Cette fonction n'écrit en réalité rien dans le flux, car les valeurs std::nullptr_t sont stockées sous la forme de 0 octet.

Il s'agit d'une fonction surchargée.

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

Lit une valeur booléenne du flux dans i. Renvoie une référence au flux.

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

Lit un octet signé du flux dans i, et renvoie une référence au flux.

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

Lit la chaîne s à partir du flux et renvoie une référence au flux.

La chaîne est désérialisée à l'aide de readBytes() où le format de sérialisation est un spécificateur de longueur quint32 en premier, suivi du nombre d'octets de données. La chaîne résultante est toujours '\0'-terminée.

L'espace pour la chaîne est alloué à l'aide de new [] - l'appelant doit le détruire à l'aide de delete [].

Il s'agit d'une fonction surchargée.

Voir aussi readBytes() et readRawData().

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

Lit un caractère de 16 bits de large du flux dans c et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

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

Lit un caractère de 32 bits de large du flux dans c et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

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

Lit un nombre à virgule flottante du flux dans f, en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également setFloatingPointPrecision().

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

Lit un nombre à virgule flottante du flux dans f, en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également setFloatingPointPrecision().

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

Lit un entier signé de 16 bits du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un entier signé de 32 bits du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un entier signé de 64 bits du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un entier 16 bits non signé du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un entier 32 bits non signé du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un entier 64 bits non signé dans le flux, dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Lit un octet non signé du flux dans i, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

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

Simule la lecture d'une valeur std::nullptr_t du flux dans ptr et renvoie une référence au flux. Cette fonction ne lit en réalité rien dans le flux, car les valeurs std::nullptr_t sont stockées sous la forme de 0 octet.

Il s'agit d'une fonction surchargée.

Non-membres apparentés

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

Écrit la paire pair dans le flux out.

Cette fonction nécessite les types T1 et T2 pour implémenter operator<<().

Cette fonction a été introduite dans Qt 6.0.

Voir aussi Serializing Qt Data Types (Sérialisation des types de données Qt).

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

Lit une paire du flux in dans pair.

Cette fonction nécessite les types T1 et T2 pour implémenter operator>>().

Cette fonction a été introduite dans Qt 6.0.

Voir aussi Serializing Qt Data Types (Sérialisation des types de données 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.