Sur cette page

QMetaType Class

La classe QMetaType gère les types nommés dans le système de méta-objets. En savoir plus...

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

Remarque : toutes les fonctions de cette classe sont sûres pour les threads.

Comparaisons QMetaType

CatégorieTypes comparables
égalitéQMetaType

Types publics

enum Type { Void, Bool, Int, UInt, Double, …, UnknownType }
enum TypeFlag { NeedsConstruction, NeedsCopyConstruction, NeedsMoveConstruction, NeedsDestruction, RelocatableType, …, IsConst }
flags TypeFlags

Fonctions publiques

(since 6.0) QMetaType()
QMetaType(int typeId)
(since 6.0) qsizetype alignOf() const
(since 6.0) QPartialOrdering compare(const void *lhs, const void *rhs) const
void *construct(void *where, const void *copy = nullptr) const
void *create(const void *copy = nullptr) const
bool debugStream(QDebug &dbg, const void *rhs)
void destroy(void *data) const
void destruct(void *data) const
(since 6.0) bool equals(const void *lhs, const void *rhs) const
QMetaType::TypeFlags flags() const
(since 6.1) bool hasRegisteredDataStreamOperators() const
(since 6.0) bool hasRegisteredDebugStreamOperator() const
int id() const
(since 6.5) bool isCopyConstructible() const
(since 6.5) bool isDefaultConstructible() const
(since 6.5) bool isDestructible() const
bool isEqualityComparable() const
(since 6.5) bool isMoveConstructible() const
bool isOrdered() const
bool isRegistered() const
bool isValid() const
bool load(QDataStream &stream, void *data) const
const QMetaObject *metaObject() const
const char *name() const
(since 6.5) void registerType() const
bool save(QDataStream &stream, const void *data) const
qsizetype sizeOf() const
(since 6.6) QMetaType underlyingType() const

Membres publics statiques

bool canConvert(QMetaType fromType, QMetaType toType)
bool canView(QMetaType fromType, QMetaType toType)
bool convert(QMetaType fromType, const void *from, QMetaType toType, void *to)
QMetaType fromName(QByteArrayView typeName)
QMetaType fromType()
bool hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)
bool hasRegisteredConverterFunction()
bool hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)
(since 6.0) bool hasRegisteredMutableViewFunction()
bool isRegistered(int type)
bool registerConverter()
bool registerConverter(To (From::*function)() const)
bool registerConverter(To (From::*function)(bool *) const)
bool registerConverter(UnaryFunction function)
(since 6.0) bool registerMutableView(To (From::*function)())
(since 6.0) bool registerMutableView(UnaryFunction function)
(since 6.0) bool view(QMetaType fromType, void *from, QMetaType toType, void *to)
(since 6.4) size_t qHash(QMetaType key, size_t seed = 0)
int qMetaTypeId()
int qRegisterMetaType()
(since 6.5) int qRegisterMetaType(QMetaType meta)
bool operator!=(const QMetaType &lhs, const QMetaType &rhs)
(since 6.5) QDebug operator<<(QDebug d, QMetaType m)
bool operator==(const QMetaType &lhs, const QMetaType &rhs)

Macros

Description détaillée

Cette classe sert d’aide au marshalling des types dans QVariant ainsi que dans les connexions de signaux et de slots mises en file d’attente. Elle associe un nom de type à un type afin que celui-ci puisse être créé et détruit dynamiquement lors de l’exécution.

Les noms de types peuvent être enregistrés auprès de `QMetaType` à l’aide de ` qRegisterMetaType()` ou de ` registerType()`. L’enregistrement n’est pas obligatoire pour la plupart des opérations ; il ne l’est que pour celles qui tentent de résoudre un nom de type sous forme de chaîne de caractères en un objet `QMetaType` ou en l’identifiant du type. Cela inclut certaines connexions signal-slot de l’ancienne génération utilisant ` QObject::connect()`, la lecture de types utilisateur à partir de ` QDataStream ` à ` QVariant`, ou encore la liaison à d’autres langages et mécanismes d’IPC, tels que QML, D-Bus, JavaScript, etc.

Le code suivant alloue et détruit une instance de MyClass par son nom, ce qui nécessite que MyClass ait été préalablement enregistré :

QMetaType type = QMetaType::fromName("MyClass");
if (type.isValid()) {
    void *myClassPtr = type.create();
    //...
    type.destroy(myClassPtr);
    myClassPtr = nullptr;
}

Si l’on souhaite que les opérateurs de flux operator<<() et operator>>() fonctionnent sur des objets QVariant stockant des types personnalisés, le type personnalisé doit fournir les opérateurs operator<<() et operator>>().

Voir également Q_DECLARE_METATYPE(), QVariant::setValue(), QVariant::value() et QVariant::fromValue().

Documentation sur les types de membres

enum QMetaType::Type

Voici les types intégrés pris en charge par QMetaType:

ConstanteValeurDescription
QMetaType::Void43void
QMetaType::Bool1bool
QMetaType::Int2int
QMetaType::UInt3unsigned int
QMetaType::Double6double
QMetaType::QChar7QChar
QMetaType::QString10QString
QMetaType::QByteArray12QByteArray
QMetaType::Nullptr51std::nullptr_t
QMetaType::VoidStar31void *
QMetaType::Long32long
QMetaType::LongLong4LongLong
QMetaType::Short33short
QMetaType::Char34char
QMetaType::Char1656char16_t
QMetaType::Char3257char32_t
QMetaType::ULong35unsigned long
QMetaType::ULongLong5ULongLong
QMetaType::UShort36unsigned short
QMetaType::SChar40signed char
QMetaType::UChar37unsigned char
QMetaType::Float38float
QMetaType::Float1663qfloat16
QMetaType::QObjectStar39QObject *
QMetaType::QBitArray13QBitArray
QMetaType::QBitmap0x1009QBitmap
QMetaType::QBrush0x1002QBrush
QMetaType::QByteArrayList49QByteArrayList
QMetaType::QCborArray54QCborArray
QMetaType::QCborMap55QCborMap
QMetaType::QCborSimpleType52QCborSimpleType
QMetaType::QCborValue53QCborValue
QMetaType::QColor0x1003QColor
QMetaType::QColorSpace0x1017QColorSpace (introduit dans Qt 5.15)
QMetaType::QCursor0x100aQCursor
QMetaType::QDate14QDate
QMetaType::QDateTime16QDateTime
QMetaType::QEasingCurve29QEasingCurve
QMetaType::QFont0x1000QFont
QMetaType::QIcon0x1005QIcon
QMetaType::QImage0x1006QImage
QMetaType::QJsonArray47QJsonArray
QMetaType::QJsonDocument48QJsonDocument
QMetaType::QJsonObject46QJsonObject
QMetaType::QJsonValue45QJsonValue
QMetaType::QKeySequence0x100bQKeySequence
QMetaType::QLine23QLigne
QMetaType::QLineF24QLineF
QMetaType::QLocale18QLocale
QMetaType::QMatrix4x40x1011QMatrix4x4
QMetaType::QModelIndex42QModelIndex
QMetaType::QPalette0x1004QPalette
QMetaType::QPen0x100cQPen
QMetaType::QPersistentModelIndex50QPersistentModelIndex (introduit dans Qt 5.5)
QMetaType::QPixmap0x1001QPixmap
QMetaType::QPoint25QPoint
QMetaType::QPointF26QPointF
QMetaType::QPolygon0x1007QPolygon
QMetaType::QPolygonF0x1016QPolygonF
QMetaType::QQuaternion0x1015QQuaternion
QMetaType::QRect19QRect
QMetaType::QRectF20QRectF
QMetaType::QRegion0x1008QRegion
QMetaType::QRegularExpression44QExpressionRégulière
QMetaType::QSize21QSize
QMetaType::QSizeF22QSizeF
QMetaType::QSizePolicy0x2000QSizePolicy
QMetaType::QStringList11QListeDeChaînes
QMetaType::QTextFormat0x100eQFormatTexte
QMetaType::QTextLength0x100dQTextLength
QMetaType::QTime15QTime
QMetaType::QTransform0x1010QTransform
QMetaType::QUrl17QUrl
QMetaType::QUuid30QUuid
QMetaType::QVariant41QVariant
QMetaType::QVariantHash28QVariantHash
QMetaType::QVariantList9QVariantList
QMetaType::QVariantMap8QVariantMap
QMetaType::QVariantPair58QVariantPair
QMetaType::QVector2D0x1012QVecteur2D
QMetaType::QVector3D0x1013QVector3D
QMetaType::QVector4D0x1014QVector4D
QMetaType::User65536Valeur de base pour les types utilisateur
QMetaType::UnknownType0Cet identifiant de type n'est pas valide. Il est renvoyé par la fonction QMetaType pour les types qui ne sont pas enregistrés

Des types supplémentaires peuvent être enregistrés à l’aide de la fonction qRegisterMetaType() ou en appelant la fonction registerType().

Voir également type().

enum QMetaType::TypeFlag
flags QMetaType::TypeFlags

Cette énumération décrit les attributs d'un type pris en charge par QMetaType.

ConstanteValeurDescription
QMetaType::NeedsConstruction0x1Ce type dispose d'un constructeur par défaut. Si l'indicateur n'est pas activé, les instances peuvent être initialisées en toute sécurité à l'aide de memset à 0.
QMetaType::NeedsCopyConstruction (since Qt 6.5)0x4000Ce type dispose d'un constructeur de copie non trivial. Si l'indicateur n'est pas activé, les instances peuvent être copiées à l'aide de `memcpy`.
QMetaType::NeedsMoveConstruction (since Qt 6.5)0x8000Ce type dispose d'un constructeur de déplacement non trivial. Si l'indicateur n'est pas activé, les instances peuvent être déplacées à l'aide de memcpy.
QMetaType::NeedsDestruction0x2Ce type dispose d'un destructeur non trivial. Si l'indicateur n'est pas activé, il n'est pas nécessaire d'appeler le destructeur avant de supprimer les objets.
QMetaType::RelocatableType0x4Une instance d’un type possédant cet attribut peut être déplacée en toute sécurité vers un autre emplacement mémoire à l’aide de `memcpy`.
QMetaType::IsEnumeration0x10Ce type est une énumération.
QMetaType::IsUnsignedEnumeration0x100Si le type est une énumération, son type sous-jacent est non signé.
QMetaType::PointerToQObject0x8Ce type est un pointeur vers une classe dérivée de ` QObject`.
QMetaType::IsPointer0x800Ce type est un pointeur vers un autre type.
QMetaType::IsConst0x2000Indique que les valeurs de ce type sont immuables ; par exemple, parce qu’il s’agit de pointeurs vers des objets const.

Remarque : avant Qt 6.5, les indicateurs NeedsConstruction et NeedsDestruction étaient tous deux définis de manière incorrecte si le constructeur de copie ou le destructeur n'était pas trivial (c'est-à-dire si le type n'était pas trivial).

Notez que les indicateurs « Needs » peuvent être activés alors même que le métatype ne dispose pas d’un constructeur ou d’un destructeur accessible publiquement pour le type concerné.

Le type `TypeFlags` est une définition de type (`typedef`) pour `QFlags<TypeFlag>`. Il stocke une combinaison « ou » (OR) de valeurs `TypeFlag`.

Documentation des fonctions membres

[constexpr noexcept default, since 6.0] QMetaType::QMetaType()

Crée un objet QMetaType par défaut, non valide.

Cette fonction a été introduite dans Qt 6.0.

[explicit] QMetaType::QMetaType(int typeId)

Crée un objet QMetaType contenant toutes les informations relatives à l'typeId du type.

[constexpr, since 6.0] qsizetype QMetaType::alignOf() const

Renvoie l'alignement du type en octets (c'est-à-dire `alignof(T)`, où `T` est le type réel pour lequel cette instance de ` QMetaType ` a été construite).

Cette fonction est généralement utilisée conjointement avec ` construct()` pour effectuer une gestion de bas niveau de la mémoire utilisée par un type.

Cette fonction a été introduite dans Qt 6.0.

Voir également ` QMetaType::construct()` et ` QMetaType::sizeOf()`.

[static] bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)

Renvoie ` true ` si ` QMetaType::convert ` peut effectuer la conversion de ` fromType ` vers ` toType`. Notez qu’il s’agit principalement de la capacité à exécuter la conversion, alors que la conversion elle-même peut échouer lors de sa tentative (par exemple, lors de la conversion d’une valeur à virgule flottante en un entier hors de sa plage).

La fonction ` registerConverter()` permet d’enregistrer des conversions supplémentaires, soit entre un type intégré et un type non intégré, soit entre deux types non intégrés. Cette fonction renvoie ` true ` si le chemin de conversion est enregistré.

Les conversions suivantes sont prises en charge par Qt :

TypeConversion automatique vers
QMetaType::BoolQMetaType::QChar, QMetaType::Double, QMetaType::Int, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt, QMetaType::ULongLong
QMetaType::QByteArrayQMetaType::Double, QMetaType::Int, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt, QMetaType::ULongLong, QMetaType::QUuid
QMetaType::QCharQMetaType::Bool, QMetaType::Int, QMetaType::UInt, QMetaType::LongLong, QMetaType::ULongLong
QMetaType::QColorQMetaType::QString
QMetaType::QDateQMetaType::QDateTime, QMetaType::QString
QMetaType::QDateTimeQMetaType::QDate, QMetaType::QString, QMetaType::QTime
QMetaType::DoubleQMetaType::Bool, QMetaType::Int, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt, QMetaType::ULongLong
QMetaType::QFontQMetaType::QString
QMetaType::IntQMetaType::Bool, QMetaType::QChar, QMetaType::Double, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt, QMetaType::ULongLong
QMetaType::QKeySequenceQMetaType::Int, QMetaType::QString
QMetaType::QVariantListQMetaType::QStringList (si les éléments de la liste peuvent être convertis en QStrings)
QMetaType::LongLongQMetaType::Bool, QMetaType::QByteArray, QMetaType::QChar, QMetaType::Double, QMetaType::Int, QMetaType::QString, QMetaType::UInt, QMetaType::ULongLong
QMetaType::QPointQMetaType::QPointF
QMetaType::QRectQMetaType::QRectF
QMetaType::QStringQMetaType::Bool, QMetaType::QByteArray, QMetaType::QChar, QMetaType::QColor, QMetaType::QDate, QMetaType::QDateTime, QMetaType::Double, QMetaType::QFont, QMetaType::Int, QMetaType::QKeySequence, QMetaType::LongLong, QMetaType::QStringList, QMetaType::QTime, QMetaType::UInt, QMetaType::ULongLong, QMetaType::QUuid
QMetaType::QStringListQMetaType::QVariantList, QMetaType::QString (si la liste ne contient qu'un seul élément)
QMetaType::QTimeQMetaType::QString
QMetaType::UIntQMetaType::Bool, QMetaType::QChar, QMetaType::Double, QMetaType::Int, QMetaType::LongLong, QMetaType::QString, QMetaType::ULongLong
QMetaType::ULongLongQMetaType::Bool, QMetaType::QChar, QMetaType::Double, QMetaType::Int, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt
QMetaType::QUuidQMetaType::QByteArray, QMetaType::QString

Les autres conversions prises en charge incluent celles entre tous les types primitifs (int, float, bool, etc., y compris toutes les énumérations) et entre n'importe quel type de pointeur et std::nullptr_t. Les énumérations peuvent également être converties en QString et QByteArray.

Si fromType et toType sont tous deux des types dérivés de QObject (ou des pointeurs vers ceux-ci), cette fonction renverra également true si l’un des types est dérivé de l’autre. Autrement dit, elle renvoie vrai si la conversion static_cast<> du type décrit par fromType vers le type décrit par toType pouvait être compilée. La fonction convert() fonctionne comme qobject_cast() et vérifie le type dynamique de l’objet pointé par QVariant.

Un transtypage à partir d’un conteneur séquentiel renverra également « true » pour cette fonction si toType est QVariantList.

De même, une conversion à partir d’un conteneur associatif renverra également « true » à cette fonction si le toType est de type QVariantHash ou QVariantMap.

Voir également convert(), QMetaSequence::Iterable, Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(), QMetaAssociation::Iterable et Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().

[static] bool QMetaType::canView(QMetaType fromType, QMetaType toType)

Renvoie ` true ` si ` QMetaType::view ` peut créer une vue modifiable de type ` toType ` sur le type ` fromType`.

La conversion entre des pointeurs de types dérivés de QObject renverra « true » pour cette fonction si une conversion de qobject_cast du type décrit par fromType vers le type décrit par toType aboutissait.

Vous pouvez créer une vue modifiable de type QMetaSequence::Iterable sur n'importe quel conteneur enregistré avec Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE().

De même, vous pouvez créer une vue modifiable de type QMetaAssociation::Iterable sur n'importe quel conteneur enregistré avec Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().

Voir également convert(), QMetaSequence::Iterable, Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(), QMetaAssociation::Iterable et Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().

[since 6.0] QPartialOrdering QMetaType::compare(const void *lhs, const void *rhs) const

Compare les objets disponibles à l'adresse lhs et rhs afin de déterminer leur ordre.

Renvoie QPartialOrdering::Unordered si la comparaison n’est pas prise en charge ou si les valeurs ne sont pas ordonnées. Sinon, renvoie QPartialOrdering::Less, QPartialOrdering::Equivalent ou QPartialOrdering::Greater si lhs est respectivement inférieur à, égal à ou supérieur à rhs.

Les deux objets doivent être du type décrit par ce métatype. Si l’un des deux, lhs ou rhs, est de type nullptr, les valeurs ne sont pas ordonnées. La comparaison n’est prise en charge que si l’opérateur « inférieur à » du type était visible lors de la déclaration du métatype.

Si l’opérateur d’égalité du type était également visible, les valeurs ne seront considérées comme égales que si l’opérateur d’égalité indique qu’elles le sont. En l’absence d’opérateur d’égalité, lorsque aucune des deux valeurs n’est inférieure à l’autre, les valeurs sont considérées comme égales ; si l’égalité est également disponible et que ces deux valeurs ne sont pas égales, elles sont considérées comme non ordonnées, tout comme les valeurs NaN (not a number) d’un type à virgule flottante qui ne s’inscrivent pas dans son ordre.

Remarque : si aucun opérateur « inférieur à » n’était visible dans la déclaration du métatype, les valeurs sont non ordonnées même si un opérateur d’égalité visible dans la déclaration les considère comme égales : ` compare() == 0 ` ne correspond à ` equals()` que si l’opérateur « inférieur à » était visible.

Cette fonction a été introduite dans Qt 6.0.

Voir également equals() et isOrdered().

void *QMetaType::construct(void *where, const void *copy = nullptr) const

Construit une valeur du type pour lequel cette instance de ` QMetaType ` a été créée dans la mémoire existante adressée par ` where`, c'est-à-dire une copie de ` copy`, et renvoie ` where`. Si ` copy ` est égal à zéro, la valeur est construite par défaut.

Il s'agit d'une fonction de bas niveau permettant de gérer explicitement la mémoire utilisée pour stocker le type. Envisagez d'appeler ` create()` si vous n'avez pas besoin de ce niveau de contrôle (c'est-à-dire utilisez « new » plutôt que « placement new »).

Vous devez vous assurer que where pointe vers un emplacement où la nouvelle valeur peut être stockée et que where est correctement aligné. La taille du type peut être interrogée en appelant sizeOf().

La règle générale en matière d’alignement est qu’un type est aligné sur sa limite naturelle, c’est-à-dire la plus petite puissance de 2 supérieure au type, à moins que cet alignement ne soit supérieur à l’alignement utile maximal pour la plate-forme. D’un point de vue pratique, un alignement supérieur à 2 * sizeof(void*) n’est nécessaire que pour des instructions matérielles spécifiques (par exemple, les chargements et stockages SSE alignés sur x86).

[static] bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType, void *to)

Convertit l'objet situé à l'adresse from, provenant de fromType, vers l'espace préalloué à l'adresse to, de type toType. Renvoie true si la conversion a réussi, sinon false.

from et to doivent tous deux être des pointeurs valides.

void *QMetaType::create(const void *copy = nullptr) const

Renvoie une copie de ` copy`, en supposant qu'elle soit du type pour lequel cette instance de ` QMetaType ` a été créée. Si ` copy ` est de type ` nullptr`, crée une instance construite par défaut.

Voir également QMetaType::destroy().

bool QMetaType::debugStream(QDebug &dbg, const void *rhs)

Diffuse l'objet situé à l'adresse rhs vers le flux de débogage dbg. Renvoie true en cas de réussite, sinon false.

void QMetaType::destroy(void *data) const

Détruit l'data, à condition qu'il s'agisse du type pour lequel cette instance QMetaType a été créée.

Voir également QMetaType::create().

void QMetaType::destruct(void *data) const

Détruit la valeur située à l'adresse data, en supposant qu'elle soit du type pour lequel cette instance de ` QMetaType ` a été construite.

Contrairement à ` destroy()`, cette fonction n'appelle que le destructeur du type ; elle n'appelle pas l'opérateur `delete`.

Voir aussi QMetaType::construct().

[since 6.0] bool QMetaType::equals(const void *lhs, const void *rhs) const

Compare les objets situés à l'adresse lhs et rhs pour vérifier s'ils sont égaux.

Les deux objets doivent être du type décrit par ce métatype. La comparaison des deux objets n’est possible que si un opérateur « inférieur à » ou d’égalité pour ce type était visible dans la déclaration du métatype. Dans le cas contraire, le métatype ne considère jamais les valeurs comme égales. Lorsqu’un opérateur d’égalité était visible lors de la déclaration du métatype, c’est lui qui fait autorité ; sinon, si l’opérateur « inférieur à » est visible, et qu’aucune des deux valeurs n’est inférieure à l’autre, les deux sont considérées comme égales. Si les valeurs ne sont pas ordonnées (voir compare() pour plus de détails), elles ne sont pas égales.

Renvoie « true » si les deux objets sont égaux, sinon « false ».

Cette fonction a été introduite dans Qt 6.0.

Voir également isEqualityComparable() et compare().

[constexpr] QMetaType::TypeFlags QMetaType::flags() const

Renvoie les indicateurs du type pour lequel cette instance de ` QMetaType ` a été construite. Pour examiner les traits spécifiques d'un type, il est préférable d'utiliser l'une des fonctions « is- » plutôt que les indicateurs directement.

Voir également QMetaType::TypeFlags, isDefaultConstructible(), isCopyConstructible(), isMoveConstructible(), isDestructible(), isEqualityComparable() et isOrdered().

[static] QMetaType QMetaType::fromName(QByteArrayView typeName)

Renvoie un objet de type « QMetaType » correspondant à « typeName ». L'objet renvoyé n'est pas valide si le typeName n'est pas reconnu par QMetaType

[static constexpr] template <typename T> QMetaType QMetaType::fromType()

Renvoie l'QMetaType e correspondant au type spécifié dans le paramètre de modèle.

[static] bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)

Renvoie true si le système de méta-types dispose d'une conversion enregistrée entre l'identifiant de méta-type fromType et toType

[static] template <typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()

Renvoie ` true` si le système de méta-types dispose d'une conversion enregistrée du type `From` vers le type `To`.

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

[since 6.1] bool QMetaType::hasRegisteredDataStreamOperators() const

Renvoie « true » si le système de méta-types a enregistré des opérateurs de flux de données pour ce méta-type.

Cette fonction a été introduite dans Qt 6.1.

[since 6.0] bool QMetaType::hasRegisteredDebugStreamOperator() const

Renvoie ` true` si le système de méta-types dispose d’un opérateur de flux de débogage enregistré pour ce méta-type.

Cette fonction a été introduite dans Qt 6.0.

[static] bool QMetaType::hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)

Renvoie « true » si le système de méta-types dispose d'une vue modifiable enregistrée, portant l'identifiant « fromType », du méta-type dont l'identifiant est « toType ».

[static, since 6.0] template <typename From, typename To> bool QMetaType::hasRegisteredMutableViewFunction()

Renvoie ` true` si le système de méta-types dispose d'une vue modifiable enregistrée sur le type `From` de type `To`.

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

Cette fonction a été introduite dans Qt 6.0.

int QMetaType::id() const

Renvoie le type d'identifiant associé à cette instance d'QMetaType.

[noexcept, since 6.5] bool QMetaType::isCopyConstructible() const

Renvoie « true » si ce type peut être instancié par copie. Si c'est le cas, les fonctions ` construct()` et ` create()` peuvent être utilisées avec un paramètre ` copy ` non nul.

Cette fonction a été introduite dans Qt 6.5.

Voir également flags(), isDefaultConstructible(), isMoveConstructible() et isDestructible().

[noexcept, since 6.5] bool QMetaType::isDefaultConstructible() const

Renvoie « true » si ce type peut faire l'objet d'une construction par défaut. Si c'est le cas, les fonctions ` construct()` et ` create()` peuvent être utilisées avec un paramètre ` copy ` de type null.

Cette fonction a été introduite dans Qt 6.5.

Voir également flags(), isCopyConstructible(), isMoveConstructible() et isDestructible().

[noexcept, since 6.5] bool QMetaType::isDestructible() const

Renvoie « true » si ce type peut être détruit. Si c'est le cas, les fonctions ` destroy()` et ` destruct()` peuvent être appelées.

Cette fonction a été introduite dans Qt 6.5.

Voir également flags(), isDefaultConstructible(), isCopyConstructible() et isMoveConstructible().

bool QMetaType::isEqualityComparable() const

Renvoie « true » si un opérateur « inférieur ou égal à » pour le type décrit par ce métatype était visible au moment de la déclaration du métatype ; sinon, renvoie « false ».

Voir également equals() et isOrdered().

[noexcept, since 6.5] bool QMetaType::isMoveConstructible() const

Renvoie « true » si ce type peut faire l'objet d'une construction par déplacement. QMetaType ne dispose actuellement pas d'une API permettant d'utiliser ce trait.

Cette fonction a été introduite dans Qt 6.5.

Voir également flags(), isDefaultConstructible(), isCopyConstructible() et isDestructible().

bool QMetaType::isOrdered() const

Renvoie « true » si un opérateur « inférieur à » pour le type décrit par ce métatype était visible au moment de la déclaration du métatype ; sinon, renvoie « false ».

Voir également compare() et isEqualityComparable().

[noexcept] bool QMetaType::isRegistered() const

Renvoie ` true ` si cet objet ` QMetaType ` a été enregistré dans le registre global des métatypes de Qt. L'enregistrement permet de retrouver le type par son nom (à l'aide de ` QMetaType::fromName()`) ou par son identifiant (à l'aide du constructeur).

Voir également qRegisterMetaType() et isValid().

[static] bool QMetaType::isRegistered(int type)

Renvoie « true » si le type de données dont l'ID est « type » est enregistré ; sinon, renvoie « false ».

Voir également type() et Type.

[constexpr noexcept] bool QMetaType::isValid() const

Renvoie « true » si cet objet « QMetaType » contient des informations valides sur un type, « false » dans le cas contraire.

Voir également isRegistered().

bool QMetaType::load(QDataStream &stream, void *data) const

Lit l'objet de ce type à partir du fichier stream et le stocke dans data. Renvoie true si l'objet a été chargé avec succès ; sinon, renvoie false.

En règle générale, vous ne devriez pas avoir besoin d’appeler cette fonction directement. Utilisez plutôt la méthode operator>>() de QVariant, qui s’appuie sur load() pour charger les types personnalisés.

Voir également save().

[constexpr] const QMetaObject *QMetaType::metaObject() const

Renvoie une classe « QMetaObject » associée à ce type.

Si le type est un type de pointeur vers une sous-classe de ` QObject`, ` flags()` contient ` QMetaType::PointerToQObject ` et cette fonction renvoie le ` QMetaObject` correspondant. Cela peut être utilisé en combinaison avec ` QMetaObject::newInstance()` pour créer des `QObject` de ce type.

Si le type est un Q_GADGET, flags() contient QMetaType::IsGadget. Si le type est un pointeur vers un Q_GADGET, flags() contient QMetaType::PointerToGadget. Dans les deux cas, cette fonction renvoie son QMetaObject. Cela peut être utilisé pour récupérer QMetaMethod et QMetaProperty et les utiliser sur un pointeur de ce type, par exemple, comme indiqué par QVariant::data().

Si le type est une énumération, flags() contient QMetaType::IsEnumeration. Dans ce cas, cette fonction renvoie l’ QMetaObject de l’objet englobant si l’énumération a été enregistrée en tant que Q_ENUM ou nullptr dans le cas contraire.

Voir également QMetaType::flags().

[constexpr] const char *QMetaType::name() const

Renvoie le nom du type associé à cette QMetaType, ou un pointeur nul si aucun type correspondant n'a été trouvé. Le pointeur renvoyé ne doit pas être supprimé.

Voir aussi typeName().

[static] template <typename From, typename To> bool QMetaType::registerConverter()

Enregistre la possibilité d'une conversion implicite du type « From » vers le type « To » dans le système de méta-types. Renvoie « true » si l'enregistrement a abouti, sinon « false ».

class Counter {
  int number = 0;
public:
  int value() const { return number; }
  operator int() const { return value(); }
  void increment() {++number;}
};
QMetaType::registerConverter<Counter, int>();

[static] template <typename From, typename To> bool QMetaType::registerConverter(To (From::*function)() const)

Enregistre une méthode function de la forme To From::function() const en tant que convertisseur du type From vers le type To dans le système de méta-types. Renvoie true si l'enregistrement a réussi, sinon false.

struct Coordinates {
  int x;
  int y;
  int z;

  QString toString() const { return u"[x: %1; y: %2, z: %3]"_s.arg(QString::number(x),
    QString::number(y),
    QString::number(z)); }
};
QMetaType::registerConverter<Coordinates, QString>(&Coordinates::toString);

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

[static] template <typename From, typename To> bool QMetaType::registerConverter(To (From::*function)(bool *) const)

Enregistre une méthode de type « function » telle que `To From::function(bool *ok) const` en tant que convertisseur du type `From` vers le type `To` dans le système de méta-types. Renvoie ` true ` si l'enregistrement a réussi, sinon `false`.

Le pointeur ok peut être utilisé par la fonction pour indiquer si la conversion a réussi.

struct BigNumber {
    long long l;

    int toInt(bool *ok = nullptr) const {
      const bool canConvertSafely = l < std::numeric_limits<int>::max();
      if (ok)
        *ok = canConvertSafely;
      return l;
    }
};
QMetaType::registerConverter<BigNumber, int>(&BigNumber::toInt);

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

[static] template < typename From, typename To, typename UnaryFunction > bool QMetaType::registerConverter(UnaryFunction function)

Enregistre un objet de fonction unaire function en tant que convertisseur du type From vers le type To dans le système de méta-types. Renvoie true si l'enregistrement a réussi, sinon false.

function Doit prendre une instance de type From et renvoyer une instance de To. Il peut s’agir d’un pointeur de fonction, d’un lambda ou d’un objet functor. Depuis Qt 6.5, l’ function peut également renvoyer une instance de std::optional<To> afin de pouvoir signaler les conversions ayant échoué.

QMetaType::registerConverter<CustomStringType, QString>([](const CustomStringType &str) {
    return QString::fromUtf8(str.data());
});
QMetaType::registerConverter<QJsonValue, CustomPointType>(
          [](const QJsonValue &value) -> std::optional<CustomPointType> {
    const auto object = value.toObject();
    if (!object.contains("x") || !object.contains("y"))
        return std::nullopt;  // The conversion fails if the required properties are missing
    return CustomPointType{object["x"].toDouble(), object["y"].toDouble()};
});

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

[static, since 6.0] template <typename From, typename To> bool QMetaType::registerMutableView(To (From::*function)())

Enregistre une méthode function, telle que To From::function(), en tant que vue modifiable de type To sur le type From dans le système de méta-types. Renvoie true si l'enregistrement a réussi, sinon false.

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

Cette fonction a été introduite dans Qt 6.0.

[static, since 6.0] template < typename From, typename To, typename UnaryFunction > bool QMetaType::registerMutableView(UnaryFunction function)

Enregistre un objet de fonction unaire function en tant que vue modifiable de type To sur le type From dans le système de méta-types. Renvoie true si l'enregistrement a réussi, sinon false.

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

Cette fonction a été introduite dans Qt 6.0.

[since 6.5] void QMetaType::registerType() const

Enregistre cette QMetaType dans le registre des types afin qu'elle puisse être retrouvée par son nom, à l'aide de la fonction QMetaType::fromName().

Cette fonction a été introduite dans Qt 6.5.

Voir également qRegisterMetaType().

bool QMetaType::save(QDataStream &stream, const void *data) const

Enregistre l'objet pointé par ` data ` dans le fichier ` stream` indiqué. Renvoie ` true ` si l'objet est enregistré avec succès ; sinon, renvoie ` false`.

En règle générale, vous ne devriez pas avoir besoin d’appeler cette fonction directement. Utilisez plutôt la méthode ` operator<<()` de ` QVariant`, qui s’appuie sur `save()` pour enregistrer les types personnalisés.

Voir également load().

[constexpr] qsizetype QMetaType::sizeOf() const

Renvoie la taille du type en octets (c'est-à-dire `sizeof(T)`, où `T` est le type réel pour lequel cette instance de ` QMetaType ` a été construite).

Cette fonction est généralement utilisée conjointement avec ` construct()` pour assurer la gestion de bas niveau de la mémoire utilisée par un type.

Voir également ` QMetaType::construct()` et ` QMetaType::alignOf()`.

[since 6.6] QMetaType QMetaType::underlyingType() const

Si ce métatype représente une énumération, cette méthode renvoie un métatype de classe numérique ayant le même signe et la même taille que le type sous-jacent de l'énumération. S'il représente un type de type « QFlags », elle renvoie QMetaType::Int. Dans tous les autres cas, une exception QMetaType est renvoyée.

Cette fonction a été introduite dans Qt 6.6.

[static, since 6.0] bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)

Crée une vue modifiable de l'objet situé à l'adresse from de type fromType dans l'espace préalloué à l'adresse to de type toType. Renvoie true si la conversion a réussi, sinon false.

Cette fonction a été introduite dans Qt 6.0.

Éléments non membres associés

[since 6.4] size_t qHash(QMetaType key, size_t seed = 0)

Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.

Cette fonction a été introduite dans Qt 6.4.

[constexpr] template <typename T> int qMetaTypeId()

Renvoie l'identifiant du méta-type de type T lors de la compilation. Si le type n'a pas été déclaré à l'aide de la fonction Q_DECLARE_METATYPE(), la compilation échouera.

Exemple d'utilisation :

int id = qMetaTypeId<QString>();    // id is now QMetaType::QString
id = qMetaTypeId<MyStruct>();       // compile error if MyStruct not declared

QMetaType::type() renvoie le même identifiant que qMetaTypeId(), mais effectue une recherche à l'exécution en fonction du nom du type. QMetaType::type() est légèrement plus lent, mais la compilation aboutit même si le type n'est pas enregistré.

Voir également Q_DECLARE_METATYPE() et QMetaType::type().

[constexpr] template <typename T> int qRegisterMetaType()

Appelez cette fonction pour enregistrer le type « T ». Renvoie l'identifiant du métatype.

Exemple :

int id = qRegisterMetaType<MyStruct>();

Cette fonction nécessite que T soit un type entièrement défini au moment où la fonction est appelée. Pour les types de pointeurs, elle nécessite également que le type pointé soit entièrement défini. Utilisez Q_DECLARE_OPAQUE_POINTER() pour pouvoir enregistrer des pointeurs vers des types déclarés en avance.

Pour utiliser le type T dans QMetaType, QVariant ou avec l’API QObject::property(), aucun enregistrement n’est nécessaire.

Pour utiliser l'T de type dans les connexions de signaux et de slots en file d'attente, la fonction qRegisterMetaType<T>() doit être appelée avant l'établissement de la première connexion. Cela se fait généralement dans le constructeur de la classe qui utilise T, ou dans la fonction main().

Une fois qu’un type a été enregistré, il peut être retrouvé par son nom à l’aide de la fonction ` QMetaType::fromName()`.

Voir également Q_DECLARE_METATYPE().

[since 6.5] int qRegisterMetaType(QMetaType meta)

Enregistre le méta-type meta et renvoie son identifiant de type.

Pour utiliser un type dont le méta-type est « meta » dans des connexions de signaux et de slots en file d'attente, la fonction ` qRegisterMetaType(meta) ` doit être appelée avant l'établissement de la première connexion. Cela se fait généralement dans le constructeur de la classe qui utilise le méta-type, ou dans la fonction ` main() `.

Une fois qu’un type a été enregistré, il peut être recherché par son nom à l’aide de ` QMetaType::fromName()`.

Cette fonction a été introduite dans Qt 6.5.

[noexcept] bool operator!=(const QMetaType &lhs, const QMetaType &rhs)

Renvoie « true » si l'QMetaType lhs représente un type différent de celui de QMetaType rhs ; sinon, renvoie « false ».

[since 6.5] QDebug operator<<(QDebug d, QMetaType m)

Écrit la QMetaType e m dans le flux d, puis renvoie ce flux.

Cette fonction a été introduite dans Qt 6.5.

[noexcept] bool operator==(const QMetaType &lhs, const QMetaType &rhs)

Renvoie « true » si l'QMetaType lhs représente le même type que l'QMetaType rhs ; sinon, renvoie « false ».

Documentation des macros

Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)

Cette macro permet à QMetaType de reconnaître le conteneur Container comme un conteneur associatif. Cela permet d'insérer une instance de Container<T, U> dans un QVariant, à condition que T et U soient eux-mêmes reconnus par QMetaType.

Notez que tous les conteneurs associatifs Qt bénéficient déjà d’une prise en charge intégrée, et qu’il n’est pas nécessaire d’utiliser cette macro avec eux. Le conteneur std::map bénéficie également d’une prise en charge intégrée.

Cet exemple illustre une utilisation typique de Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE() :

#include <unordered_map>

Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(std::unordered_map)

void someFunction()
{
    std::unordered_map<int, bool> container;
    QVariant var = QVariant::fromValue(container);
    // ...
}

Q_DECLARE_METATYPE(Type)

Cette macro permet à QMetaType de reconnaître le type Type, à condition que celui-ci dispose d’un constructeur par défaut public, d’un constructeur de copie public et d’un destructeur public. Elle est nécessaire pour utiliser le type Type en tant que type personnalisé dans QVariant.

Cette macro exige que Type soit un type entièrement défini au moment de son utilisation. Pour les types de pointeurs, elle exige également que le type pointé soit entièrement défini. À utiliser conjointement avec Q_DECLARE_OPAQUE_POINTER() pour enregistrer des pointeurs vers des types déclarés en avant.

Idéalement, cette macro doit être placée sous la déclaration de la classe ou de la structure. Si cela n’est pas possible, elle peut être placée dans un fichier d’en-tête privé qui doit être inclus chaque fois que ce type est utilisé dans une ` QVariant`.

L’ajout d’un `Q_DECLARE_METATYPE()` rend le type connu de toutes les fonctions basées sur des modèles, y compris ` QVariant`. Notez que si vous avez l’intention d’utiliser le type dans des connexions de signaux et de slots en file d’attente ou dans le système de propriétés de ` QObject`, vous devez également appeler ` qRegisterMetaType()`, car les noms sont résolus lors de l’exécution.

Cet exemple illustre un cas d'utilisation typique de Q_DECLARE_METATYPE() :

struct MyStruct
{
    int i;
    //...
};

Q_DECLARE_METATYPE(MyStruct)

Si MyStruct se trouve dans un espace de noms, la macro Q_DECLARE_METATYPE() doit être placée en dehors de cet espace de noms :

namespace MyNamespace
{
    struct MyStruct
    {
        //...
    };
}

Q_DECLARE_METATYPE(MyNamespace::MyStruct)

Comme MyStruct est désormais connu de QMetaType, il peut être utilisé dans QVariant:

MyStruct s;
QVariant var;
var.setValue(s); // copy s into the variant

//...

// retrieve the value
MyStruct s2 = var.value<MyStruct>();

Certains types sont enregistrés automatiquement et ne nécessitent pas cette macro :

Remarque : cette méthode enregistre également les opérateurs de flux et de débogage pour le type s’ils sont visibles au moment de l’enregistrement. Comme cela se fait automatiquement dans certains cas, il est fortement recommandé de déclarer les opérateurs de flux pour un type directement après le type lui-même. En raison des règles de recherche dépendantes des arguments du C++, il est également fortement recommandé de déclarer les opérateurs dans le même espace de noms que le type lui-même.

Les opérateurs de flux doivent présenter les signatures suivantes :

QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);

Voir également ` qRegisterMetaType()`.

Q_DECLARE_OPAQUE_POINTER(PointerType)

Cette macro permet d'enregistrer les pointeurs vers des types déclarés à l'avance (PointerType) auprès de QMetaType à l'aide de Q_DECLARE_METATYPE() ou de qRegisterMetaType().

N’utilisez pas cette macro pour éviter les messages d’avertissement ou les erreurs générés par moc concernant des types de propriétés incomplets lorsque le type pointé est utilisé comme type complet dans d’autres contextes du programme. Utilisez plutôt Q_MOC_INCLUDE lorsque la définition complète du type est disponible, mais que vous préférez une déclaration anticipée dans l’en-tête afin de réduire les temps de compilation.

Avertissement : n’ utilisezpas Q_DECLARE_OPAQUE_POINTER avec des pointeurs vers une classe de type « Q_OBJECT » ou une classe « gadget », car cela risque d’introduire des informations incohérentes dans le système de méta-types.

Voir également Q_DECLARE_METATYPE() et qRegisterMetaType().

Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container)

Cette macro permet à QMetaType de reconnaître le conteneur Container comme un conteneur séquentiel. Cela permet d'insérer une instance de Container<T> dans un QVariant, si T est lui-même reconnu par QMetaType.

Notez que tous les conteneurs séquentiels Qt disposent déjà d’une prise en charge intégrée, et qu’il n’est pas nécessaire d’utiliser cette macro avec eux. Les conteneurs std::vector et std::list disposent également d’une prise en charge intégrée.

Cet exemple illustre une utilisation typique de `Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()` :

#include <deque>

Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(std::deque)

void someFunc()
{
    std::deque<QFile*> container;
    QVariant var = QVariant::fromValue(container);
    // ...
}

Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer)

Cette macro permet à QMetaType de reconnaître le pointeur intelligent SmartPointer comme tel. Cela permet d'insérer une instance de SmartPointer<T> dans un QVariant, si T est un type héritant de QObject.

Notez que les QWeakPointer, QSharedPointer et QPointer disposent déjà d’une prise en charge intégrée, et qu’il n’est pas nécessaire d’utiliser cette macro avec elles.

Cet exemple illustre une utilisation typique de `Q_DECLARE_SMART_POINTER_METATYPE()` :

#include <memory>

Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr)

void someMethod()
{
    auto smart_ptr = std::make_shared<QFile>();
    QVariant var = QVariant::fromValue(smart_ptr);
    // ...
    if (var.canConvert<QObject*>()) {
        QObject*sp = var.value<QObject*>();
        qDebug() << sp->metaObject()->className(); // Prints 'QFile'.
    }
}

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