Sur cette page

QMetaType Class

La classe QMetaType gère les types nommés dans le système des méta-objets. Plus d'informations...

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

Cette classe est comparable à l'égalité.

Note : Toutes les fonctions de cette classe sont sûres pour les threads.

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::*)() const function)
bool registerConverter(To (From::*)(bool *) const function)
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 est utilisée comme aide pour rassembler les types dans QVariant et dans les connexions de signaux et de slots en file d'attente. Elle associe un nom de type à un type afin qu'il puisse être créé et détruit dynamiquement au moment de l'exécution.

Les noms de type peuvent être enregistrés auprès de QMetaType en utilisant qRegisterMetaType() ou registerType(). L'enregistrement n'est pas nécessaire pour la plupart des opérations ; il ne l'est que pour les opérations 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. Il s'agit notamment de certaines connexions de fente de signal à l'ancienne utilisant QObject::connect(), de la lecture de types d'utilisateurs de QDataStream à QVariant, ou de la liaison à d'autres langages et mécanismes 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 nous voulons que les opérateurs de flux operator<<() et operator>>() fonctionnent sur les objets QVariant qui stockent 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

Il s'agit des types intégrés pris en charge par QMetaType:

ConstanteValeurDescription du type
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::QLine23QLine
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::QRegularExpression44QRegularExpression
QMetaType::QSize21QSize
QMetaType::QSizeF22QSizeF
QMetaType::QSizePolicy0x2000QSizePolicy
QMetaType::QStringList11QStringList
QMetaType::QTextFormat0x100eQTextFormat
QMetaType::QTextLength0x100dQTextLength
QMetaType::QTime15QTime
QMetaType::QTransform0x1010QTransform
QMetaType::QUrl17QUrl
QMetaType::QUuid30QUuid
QMetaType::QVariant41QVariant
QMetaType::QVariantHash28QVariantHash
QMetaType::QVariantList9QVariantList
QMetaType::QVariantMap8QVariantMap
QMetaType::QVariantPair58QVariantPair
QMetaType::QVector2D0x1012QVector2D
QMetaType::QVector3D0x1013QVector3D
QMetaType::QVector4D0x1014QVector4D
QMetaType::User65536Valeur de base pour les types d'utilisateurs
QMetaType::UnknownType0Il s'agit d'un identifiant de type non valide. Il est renvoyé par QMetaType pour les types qui ne sont pas enregistrés

Des types supplémentaires peuvent être enregistrés en utilisant qRegisterMetaType() ou en appelant registerType().

Voir aussi type().

enum QMetaType::TypeFlag
flags QMetaType::TypeFlags

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

ConstanteValeurDescription du type
QMetaType::NeedsConstruction0x1Ce type a un constructeur par défaut. Si l'indicateur n'est pas activé, les instances peuvent être initialisées en toute sécurité avec memset to 0.
QMetaType::NeedsCopyConstruction (since Qt 6.5)0x4000Ce type possède un constructeur de copie non trivial. Si l'indicateur n'est pas défini, les instances peuvent être copiées avec memcpy.
QMetaType::NeedsMoveConstruction (since Qt 6.5)0x8000Ce type possède un constructeur de déplacement non trivial. Si l'indicateur n'est pas défini, les instances peuvent être déplacées avec memcpy.
QMetaType::NeedsDestruction0x2Ce type possède un destructeur non trivial. Si l'indicateur n'est pas activé, il n'est pas nécessaire d'appeler le destructeur avant de se débarrasser des objets.
QMetaType::RelocatableType0x4Une instance d'un type ayant 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 unsigned.
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 constants.

Note : Avant Qt 6.5, les drapeaux NeedsConstruction et NeedsDestruction étaient incorrectement positionnés si le construteur de copie ou le destructeur n'étaient pas triviaux (c'est-à-dire si le type n'était pas trivial).

Notez que les drapeaux Needs peuvent être activés mais que le méta type peut ne pas avoir de constructeur du type concerné accessible au public ou de destructeur accessible au public.

Le type TypeFlags est un typedef pour QFlags<TypeFlag>. Il stocke une combinaison OR de valeurs TypeFlag.

Documentation des fonctions membres

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

Construit un objet QMetaType invalide par défaut.

Cette fonction a été introduite dans Qt 6.0.

[explicit] QMetaType::QMetaType(int typeId)

Construit un objet QMetaType qui contient toutes les informations sur le type typeId.

[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 QMetaType a été construite).

Cette fonction est généralement utilisée 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 aussi QMetaType::construct() et QMetaType::sizeOf().

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

Renvoie true si QMetaType::convert peut convertir fromType en toType. Notez qu'il s'agit principalement de la capacité à exécuter la conversion, alors que la conversion réelle peut échouer lorsqu'elle est tentée (par exemple, la conversion d'une valeur à virgule flottante en un entier en dehors de sa plage).

La fonction registerConverter() peut être utilisée pour 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 :

TypeAutomatiquement coulé en
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 contient exactement un é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

D'autres conversions sont possibles entre tous les types primitifs (int, float, bool, etc., y compris tous les enums) 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 eux), cette fonction renvoie également true si l'un des types est dérivé de l'autre. En d'autres termes, elle renvoie vrai si static_cast<> du type décrit par fromType vers le type décrit par toType se compile. La fonction convert() fonctionne comme qobject_cast() et vérifie le type dynamique de l'objet pointé par QVariant.

Un cast à partir d'un conteneur séquentiel renverra également un vrai pour cette fonction si le toType est QVariantList.

De même, un cast à partir d'un conteneur associatif retournera également vrai pour cette fonction si toType est QVariantHash ou QVariantMap.

Voir aussi 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 mutable du type toType sur le type fromType.

La conversion entre pointeurs de types dérivés de QObject renverra vrai pour cette fonction si un qobject_cast du type décrit par fromType vers le type décrit par toType réussirait.

Vous pouvez créer une vue mutable 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 mutable de type QMetaAssociation::Iterable sur n'importe quel conteneur enregistré avec Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().

Voir aussi 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 à lhs et rhs pour l'ordre.

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

Les deux objets doivent être du type décrit par ce métatype. Si lhs ou rhs est nullptr, les valeurs ne sont pas ordonnées. La comparaison n'est prise en charge que si l'opérateur "less than" du type était visible dans la déclaration du métatype.

Si l'opérateur d'égalité du type était également visible, les valeurs ne seront comparées que si l'opérateur d'égalité indique qu'elles sont égales. En l'absence d'opérateur d'égalité, lorsque aucune valeur n'est inférieure à l'autre, les valeurs sont considérées comme égales ; si l'opérateur d'égalité est également disponible et que deux valeurs de ce type 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 se situent en dehors de son ordre.

Note : Si aucun opérateur less than n'était visible dans la déclaration du métatype, les valeurs ne sont pas ordonnées même si un opérateur d'égalité visible dans la déclaration les considère comme égales : compare() == 0 n'est en accord avec equals() que si l'opérateur less than était visible.

Cette fonction a été introduite dans Qt 6.0.

Voir aussi equals() et isOrdered().

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

Construit une valeur du type pour lequel cette instance QMetaType a été construite dans la mémoire existante adressée par where, qui est 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. Pensez à 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 demandée en appelant sizeOf().

La règle empirique en matière d'alignement est qu'un type est aligné sur sa limite naturelle, qui est la plus petite puissance de 2 plus grande que le type, à moins que cet alignement ne soit supérieur à l'alignement maximal utile pour la plate-forme. En pratique, un alignement supérieur à 2 * sizeof(void*) n'est nécessaire que pour les instructions matérielles spéciales (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 à from de fromType en l'espace préalloué à to typé toType. Retourne true, si la conversion a réussi, sinon false.

from et to doivent être des pointeurs valides.

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

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

Voir aussi QMetaType::destroy().

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

Transmet l'objet à rhs au flux de débogage dbg. Retourne true en cas de succès, sinon false.

void QMetaType::destroy(void *data) const

Détruit l'instance data, en supposant qu'elle soit du type pour lequel cette instance QMetaType a été créée.

Voir aussi 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 QMetaType a été construite.

Contrairement à destroy(), cette fonction n'invoque que le destructeur du type, elle n'invoque pas l'opérateur de suppression.

Voir également QMetaType::construct().

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

Compare les objets à lhs et rhs pour vérifier leur égalité.

Les deux objets doivent être du type décrit par ce métatype. Il ne peut comparer les deux objets que si un opérateur inférieur ou un opérateur d'égalité pour le 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 dans la déclaration du métatype, il fait autorité ; sinon, si less than est visible, lorsqu'aucune valeur 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.

Retourne true si les deux objets se comparent, sinon false.

Cette fonction a été introduite dans Qt 6.0.

Voir aussi isEqualityComparable() et compare().

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

Renvoie les drapeaux du type pour lequel cette instance QMetaType a été construite. Pour inspecter les caractéristiques d'un type spécifique, il est préférable d'utiliser l'une des fonctions "is-" plutôt que les drapeaux directement.

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

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

Renvoie un QMetaType correspondant à typeName. L'objet retourné n'est pas valide si le typeName n'est pas connu de QMetaType

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

Renvoie l'adresse QMetaType correspondant au type indiqué dans le paramètre du modèle.

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

Renvoie true, si le système de méta types a enregistré une conversion de l'identifiant de méta types fromType en toType

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

Renvoie true, si le système de méta types a 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 types.

Cette fonction a été introduite dans Qt 6.1.

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

Retourne true, si le système de méta types a 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 a une vue mutable enregistrée sur l'identifiant de méta types fromType de l'identifiant de méta types toType.

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

Renvoie true, si le système de méta types a une vue mutable enregistrée sur le type From du 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 détenu par cette instance QMetaType.

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

Retourne vrai si ce type peut être construit par copie. Si c'est le cas, alors construct() et create() peuvent être utilisés avec un paramètre copy qui n'est pas nul.

Cette fonction a été introduite dans Qt 6.5.

Voir aussi flags(), isDefaultConstructible(), isMoveConstructible(), et isDestructible().

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

Retourne vrai si ce type peut être construit par défaut. Si c'est le cas, alors construct() et create() peuvent être utilisés avec un paramètre copy qui est nul.

Cette fonction a été introduite dans Qt 6.5.

Voir aussi flags(), isCopyConstructible(), isMoveConstructible() et isDestructible().

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

Retourne vrai si ce type peut être détruit. Si c'est le cas, alors destroy() et destruct() peuvent être appelés.

Cette fonction a été introduite dans Qt 6.5.

Voir aussi flags(), isDefaultConstructible(), isCopyConstructible() et isMoveConstructible().

bool QMetaType::isEqualityComparable() const

Renvoie true si un opérateur "moins que" ou "égalité" pour le type décrit par ce métatype était visible dans la déclaration du métatype, sinon false.

Voir également equals() et isOrdered().

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

Retourne vrai si ce type peut être construit par déplacement. QMetaType n'a actuellement pas d'API pour utiliser ce trait.

Cette fonction a été introduite dans Qt 6.5.

Voir aussi flags(), isDefaultConstructible(), isCopyConstructible(), et isDestructible().

bool QMetaType::isOrdered() const

Renvoie true si un opérateur moins que pour le type décrit par ce métatype était visible dans la déclaration du métatype, sinon 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 trouver le type par son nom (en utilisant QMetaType::fromName()) ou par son ID (en utilisant le constructeur).

Voir aussi qRegisterMetaType() et isValid().

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

Renvoie true si le type de données portant l'ID 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 sinon.

Voir aussi isRegistered().

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

Lit l'objet de ce type à partir de l'adresse stream dans data. Renvoie true si l'objet est chargé avec succès ; sinon, renvoie false.

Normalement, vous ne devriez pas avoir besoin d'appeler cette fonction directement. Utilisez plutôt QVariant's operator>>(), qui s'appuie sur la fonction load() pour transmettre les types personnalisés.

Voir aussi save().

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

Renvoie un QMetaObject relatif à ce type.

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

Si le type est un Q_GADGET, flags() contient QMetaType::IsGadget. Si le type est un pointeur sur 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'adresse 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 adresse QMetaType, ou un pointeur nul si aucun type correspondant n'a été trouvé. Le pointeur retourné 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. Retourne true si l'enregistrement a réussi, 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::*)() const function)

Enregistre une méthode function comme To From::function() const en tant que convertisseur du type From vers le type To dans le système de méta types. Retourne 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::*)(bool *) const function)

Enregistre une méthode function comme To From::function(bool *ok) const comme convertisseur du type From au type To dans le système de méta types. Retourne 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 fonction unaire function en tant que convertisseur du type From au type To dans le système de méta types. Retourne true si l'enregistrement a réussi, sinon false.

function doit prendre une instance du type From et retourner une instance de To. Il peut s'agir d'un pointeur de fonction, d'un lambda ou d'un objet foncteur. Depuis Qt XML 6.5, function peut également renvoyer une instance de std::optional<To> pour pouvoir indiquer les échecs de conversion.

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 comme To From::function() en tant que vue mutable du type To sur le type From dans le système de méta types. Retourne 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 mutable du type To sur le type From dans le système de méta types. Retourne 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 ce QMetaType dans le registre des types afin qu'il puisse être trouvé par son nom, en utilisant QMetaType::fromName().

Cette fonction a été introduite dans Qt 6.5.

Voir aussi qRegisterMetaType().

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

Écrit l'objet pointé par data sur le site stream. Renvoie true si l'objet est sauvegardé avec succès ; sinon, renvoie false.

Normalement, vous ne devriez pas avoir besoin d'appeler cette fonction directement. Utilisez plutôt QVariant's operator<<(), qui s'appuie sur save() pour diffuser les types personnalisés.

Voir aussi 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 QMetaType a été construite).

Cette fonction est généralement utilisée avec construct() pour effectuer une 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 d'une classe numérique ayant la même signature et la même taille que le type sous-jacent de l'énumération. S'il représente un type QFlags, elle renvoie QMetaType::Int. Dans tous les autres cas, elle renvoie une adresse QMetaType invalide.

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 mutable sur l'objet à from de fromType dans l'espace préalloué à to typé toType. Retourne true si la conversion a réussi, sinon false.

Cette fonction a été introduite dans Qt 6.0.

Non-membres apparentés

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

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

Cette fonction a été introduite dans Qt 6.4.

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

Renvoie le méta type id du type T au moment de la compilation. Si le type n'a pas été déclaré avec Q_DECLARE_METATYPE(), la compilation échouera.

Utilisation typique :

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 basée sur le nom du type. QMetaType::type() est un peu plus lent, mais la compilation réussit si un type n'est pas enregistré.

Voir aussi Q_DECLARE_METATYPE() et QMetaType::type().

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

Appeler cette fonction pour enregistrer le type T. Renvoie l'identifiant du méta type.

Exemple :

int id = qRegisterMetaType<MyStruct>();

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

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

Pour utiliser le type T dans des connexions de signaux et de créneaux en file d'attente, qRegisterMetaType<T>() doit être appelé avant que la première connexion ne soit établie. 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 trouvé par son nom en utilisant QMetaType::fromName().

Voir également Q_DECLARE_METATYPE().

[since 6.5] int qRegisterMetaType(QMetaType meta)

Enregistre le méta type meta et renvoie son type Id.

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

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

Pour utiliser le type T dans des connexions de signaux et de créneaux en file d'attente, qRegisterMetaType<T>() doit être appelé avant que la première connexion ne soit établie. 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 trouvé par son nom en utilisant QMetaType::fromName().

Cette fonction a été introduite dans Qt 6.5.

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

Renvoie true si le QMetaType lhs représente un type différent du QMetaType rhs , sinon renvoie false.

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

Écrit l'adresse QMetaType m dans le flux d, et renvoie le flux.

Cette fonction a été introduite dans Qt 6.5.

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

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

Documentation sur les macros

Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)

Cette macro fait en sorte que le conteneur Container soit connu de QMetaType en tant que conteneur associatif. Cela permet de placer une instance de Container<T, U> dans un QVariant, si T et U sont eux-mêmes connus de QMetaType.

Notez que tous les conteneurs associatifs de Qt disposent déjà d'un support intégré et qu'il n'est pas nécessaire d'utiliser cette macro avec eux. Le conteneur std::map dispose également d'un support intégré.

Cet exemple montre 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 fait connaître le type Type à QMetaType pour autant qu'il fournisse un constructeur public par défaut, un constructeur public par copie et un destructeur public. Elle est nécessaire pour utiliser le type Type comme type personnalisé dans QVariant.

Cette macro exige que Type soit un type entièrement défini à l'endroit où il est utilisé. Pour les types pointeurs, elle exige également que le type pointé soit entièrement défini. Elle peut être utilisée conjointement avec Q_DECLARE_OPAQUE_POINTER() pour enregistrer des pointeurs sur des types déclarés en amont.

Idéalement, cette macro devrait être placée sous la déclaration de la classe ou de la structure. Si ce 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 un fichier QVariant.

L'ajout d'une Q_DECLARE_METATYPE() permet à toutes les fonctions basées sur des modèles, y compris QVariant, de connaître le type. 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() puisque les noms sont résolus au moment de l'exécution.

Cet exemple montre 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 se trouver en dehors de l'espace de noms :

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

Q_DECLARE_METATYPE(MyNamespace::MyStruct)

Puisque MyStruct est maintenant 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 n'ont pas besoin de 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 est fait automatiquement à certains endroits, 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épendant de l'argument 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 avoir les signatures suivantes :

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

Voir aussi qRegisterMetaType().

Q_DECLARE_OPAQUE_POINTER(PointerType)

Cette macro permet aux pointeurs vers des types déclarés en amont (PointerType) d'être enregistrés avec QMetaType en utilisant Q_DECLARE_METATYPE() ou qRegisterMetaType().

N'utilisez pas cette macro pour éviter les plaintes ou les erreurs de moc concernant des types de propriété incomplets lorsque le type pointé est utilisé comme un 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 directe dans l'en-tête pour réduire les temps de compilation.

Attention : N'utilisez pas Q_DECLARE_OPAQUE_POINTER avec des pointeurs vers Q_OBJECT ou une classe de gadget, car cela risque d'introduire des informations incohérentes dans le système de méta-type.

Voir aussi Q_DECLARE_METATYPE() et qRegisterMetaType().

Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container)

Cette macro fait en sorte que le conteneur Container soit connu de QMetaType en tant que conteneur séquentiel. Cela permet de placer une instance de Container<T> dans un QVariant, si T lui-même est connu de QMetaType.

Notez que tous les conteneurs séquentiels de Qt ont déjà un support intégré et qu'il n'est pas nécessaire d'utiliser cette macro avec eux. Les conteneurs std::vector et std::list ont également un support intégré.

Cet exemple montre 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 fait en sorte que le pointeur intelligent SmartPointer soit connu de QMetaType comme un pointeur intelligent. Cela permet de placer une instance de SmartPointer<T> dans un QVariant, si T est un type qui hérite de QObject.

Notez que les QWeakPointer, QSharedPointer et QPointer disposent déjà d'un support intégré et qu'il n'est pas nécessaire d'utiliser cette macro avec eux.

Cet exemple montre 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.