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égorie | Types 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) |
Éléments non membres associés
(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
| Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container) | |
| Q_DECLARE_METATYPE(Type) | |
| Q_DECLARE_OPAQUE_POINTER(PointerType) | |
| Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container) | |
| Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer) |
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:
| Constante | Valeur | Description |
|---|---|---|
QMetaType::Void | 43 | void |
QMetaType::Bool | 1 | bool |
QMetaType::Int | 2 | int |
QMetaType::UInt | 3 | unsigned int |
QMetaType::Double | 6 | double |
QMetaType::QChar | 7 | QChar |
QMetaType::QString | 10 | QString |
QMetaType::QByteArray | 12 | QByteArray |
QMetaType::Nullptr | 51 | std::nullptr_t |
QMetaType::VoidStar | 31 | void * |
QMetaType::Long | 32 | long |
QMetaType::LongLong | 4 | LongLong |
QMetaType::Short | 33 | short |
QMetaType::Char | 34 | char |
QMetaType::Char16 | 56 | char16_t |
QMetaType::Char32 | 57 | char32_t |
QMetaType::ULong | 35 | unsigned long |
QMetaType::ULongLong | 5 | ULongLong |
QMetaType::UShort | 36 | unsigned short |
QMetaType::SChar | 40 | signed char |
QMetaType::UChar | 37 | unsigned char |
QMetaType::Float | 38 | float |
QMetaType::Float16 | 63 | qfloat16 |
QMetaType::QObjectStar | 39 | QObject * |
QMetaType::QBitArray | 13 | QBitArray |
QMetaType::QBitmap | 0x1009 | QBitmap |
QMetaType::QBrush | 0x1002 | QBrush |
QMetaType::QByteArrayList | 49 | QByteArrayList |
QMetaType::QCborArray | 54 | QCborArray |
QMetaType::QCborMap | 55 | QCborMap |
QMetaType::QCborSimpleType | 52 | QCborSimpleType |
QMetaType::QCborValue | 53 | QCborValue |
QMetaType::QColor | 0x1003 | QColor |
QMetaType::QColorSpace | 0x1017 | QColorSpace (introduit dans Qt 5.15) |
QMetaType::QCursor | 0x100a | QCursor |
QMetaType::QDate | 14 | QDate |
QMetaType::QDateTime | 16 | QDateTime |
QMetaType::QEasingCurve | 29 | QEasingCurve |
QMetaType::QFont | 0x1000 | QFont |
QMetaType::QIcon | 0x1005 | QIcon |
QMetaType::QImage | 0x1006 | QImage |
QMetaType::QJsonArray | 47 | QJsonArray |
QMetaType::QJsonDocument | 48 | QJsonDocument |
QMetaType::QJsonObject | 46 | QJsonObject |
QMetaType::QJsonValue | 45 | QJsonValue |
QMetaType::QKeySequence | 0x100b | QKeySequence |
QMetaType::QLine | 23 | QLigne |
QMetaType::QLineF | 24 | QLineF |
QMetaType::QLocale | 18 | QLocale |
QMetaType::QMatrix4x4 | 0x1011 | QMatrix4x4 |
QMetaType::QModelIndex | 42 | QModelIndex |
QMetaType::QPalette | 0x1004 | QPalette |
QMetaType::QPen | 0x100c | QPen |
QMetaType::QPersistentModelIndex | 50 | QPersistentModelIndex (introduit dans Qt 5.5) |
QMetaType::QPixmap | 0x1001 | QPixmap |
QMetaType::QPoint | 25 | QPoint |
QMetaType::QPointF | 26 | QPointF |
QMetaType::QPolygon | 0x1007 | QPolygon |
QMetaType::QPolygonF | 0x1016 | QPolygonF |
QMetaType::QQuaternion | 0x1015 | QQuaternion |
QMetaType::QRect | 19 | QRect |
QMetaType::QRectF | 20 | QRectF |
QMetaType::QRegion | 0x1008 | QRegion |
QMetaType::QRegularExpression | 44 | QExpressionRégulière |
QMetaType::QSize | 21 | QSize |
QMetaType::QSizeF | 22 | QSizeF |
QMetaType::QSizePolicy | 0x2000 | QSizePolicy |
QMetaType::QStringList | 11 | QListeDeChaînes |
QMetaType::QTextFormat | 0x100e | QFormatTexte |
QMetaType::QTextLength | 0x100d | QTextLength |
QMetaType::QTime | 15 | QTime |
QMetaType::QTransform | 0x1010 | QTransform |
QMetaType::QUrl | 17 | QUrl |
QMetaType::QUuid | 30 | QUuid |
QMetaType::QVariant | 41 | QVariant |
QMetaType::QVariantHash | 28 | QVariantHash |
QMetaType::QVariantList | 9 | QVariantList |
QMetaType::QVariantMap | 8 | QVariantMap |
QMetaType::QVariantPair | 58 | QVariantPair |
QMetaType::QVector2D | 0x1012 | QVecteur2D |
QMetaType::QVector3D | 0x1013 | QVector3D |
QMetaType::QVector4D | 0x1014 | QVector4D |
QMetaType::User | 65536 | Valeur de base pour les types utilisateur |
QMetaType::UnknownType | 0 | Cet 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.
| Constante | Valeur | Description |
|---|---|---|
QMetaType::NeedsConstruction | 0x1 | Ce 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) | 0x4000 | Ce 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) | 0x8000 | Ce 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::NeedsDestruction | 0x2 | Ce 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::RelocatableType | 0x4 | Une 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::IsEnumeration | 0x10 | Ce type est une énumération. |
QMetaType::IsUnsignedEnumeration | 0x100 | Si le type est une énumération, son type sous-jacent est non signé. |
QMetaType::PointerToQObject | 0x8 | Ce type est un pointeur vers une classe dérivée de ` QObject`. |
QMetaType::IsPointer | 0x800 | Ce type est un pointeur vers un autre type. |
QMetaType::IsConst | 0x2000 | Indique 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 :
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 declaredQMetaType::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 :
- Les pointeurs vers des classes dérivées de QObject
- QList<T>, QQueue<T>, QStack<T> ou QSet<T>, où T est un métatype enregistré
- QHash<T1, T2>, QMap<T1, T2> ou std::pair<T1, T2>, où T1 et T2 sont des méta-types enregistrés
- QPointer<T>, QSharedPointer<T>, QWeakPointer<T>, où T est une classe dérivée de QObject
- des énumérations enregistrées avec Q_ENUM ou Q_FLAG
- des classes disposant d’une macro Q_GADGET
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.