QMetaMethod Class
La classe `QMetaMethod` fournit des métadonnées sur une fonction membre. En savoir plus…
| En-tête : | #include <QMetaMethod> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
Comparaisons des QMetaMethod
| Catégorie | Types comparables |
|---|---|
| égalité | QMetaMethod |
Types publics
| enum | Access { Private, Protected, Public } |
| enum | MethodType { Method, Signal, Slot, Constructor } |
Fonctions publiques
| QMetaMethod::Access | access() const |
(since 6.5) bool | invoke(QObject *obj, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.2) bool | isConst() const |
| bool | isValid() const |
| int | methodIndex() const |
| QByteArray | methodSignature() const |
| QMetaMethod::MethodType | methodType() const |
| QByteArray | name() const |
(since 6.9) QByteArrayView | nameView() const |
| int | parameterCount() const |
(since 6.0) QMetaType | parameterMetaType(int index) const |
| QList<QByteArray> | parameterNames() const |
| int | parameterType(int index) const |
(since 6.0) QByteArray | parameterTypeName(int index) const |
| QList<QByteArray> | parameterTypes() const |
(since 6.0) int | relativeMethodIndex() const |
(since 6.0) QMetaType | returnMetaType() const |
| int | returnType() const |
| int | revision() const |
| const char * | tag() const |
| const char * | typeName() const |
Membres publics statiques
| QMetaMethod | fromSignal(PointerToMemberFunction signal) |
Éléments non membres associés
| bool | operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs) |
| bool | operator==(const QMetaMethod &lhs, const QMetaMethod &rhs) |
Macros
(until 6.13) | Q_METAMETHOD_INVOKE_MAX_ARGS |
Description détaillée
Une méthode QMetaMethod possède une spécification d'methodType(), une spécification d'methodSignature(), une liste de spécifications d'parameterTypes() et d'parameterNames(), une spécification de retour typeName(), une spécification de tag() et une spécification d'access(). Vous pouvez utiliser invoke() pour invoquer la méthode sur un objet QObject quelconque.
Voir également QMetaObject, QMetaEnum, QMetaProperty et le système de propriétés de Qt.
Documentation sur les types de membres
enum QMetaMethod::Access
Cette énumération décrit le niveau d'accès d'une méthode, conformément aux conventions utilisées en C++.
| Constante | Valeur |
|---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
| Constante | Valeur | Description |
|---|---|---|
QMetaMethod::Method | QMETHOD_CODE | La fonction est une fonction membre simple. |
QMetaMethod::Signal | 1 | La fonction est un signal. |
QMetaMethod::Slot | 2 | La fonction est un slot. |
QMetaMethod::Constructor | 3 | La fonction est un constructeur. |
Documentation sur les fonctions membres
QMetaMethod::Access QMetaMethod::access() const
Renvoie le niveau d'accès de cette méthode (privé, protégé ou public).
Remarque : les signaux sont toujours publics, mais vous devez considérer cela comme un détail d'implémentation. Il est presque toujours déconseillé d'émettre un signal depuis l'extérieur de sa classe.
Voir aussi ` methodType()`.
[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
Renvoie la méta-méthode correspondant à l'signal donnée, ou une valeur non valide QMetaMethod si signal est nullptr ou n'est pas un signal de la classe.
Exemple :
QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);[since 6.5] template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
[since 6.5] template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
Appelle cette méthode sur l'objet object. Renvoie true si le membre a pu être appelé. Renvoie false s'il n'existe pas de membre de ce type ou si les paramètres ne correspondent pas.
Pour les surcharges comportant un paramètre `QTemplatedMetaMethodReturnArgument`, la valeur de retour de l'appel à la fonction ` member ` est placée dans ` ret`. Pour les surcharges ne comportant pas un tel membre, la valeur de retour de la fonction appelée (le cas échéant) sera ignorée. `QTemplatedMetaMethodReturnArgument` est un type interne que vous ne devez pas utiliser directement. Utilisez plutôt la fonction `qReturnArg()`.
Les surcharges comportant un paramètre Qt::ConnectionType type permettent de choisir explicitement si l’appel sera synchrone ou non :
- Si type vaut Qt::DirectConnection, le membre sera appelé immédiatement dans le thread actuel.
- Si type est Qt::QueuedConnection, un QEvent sera envoyé et le membre sera appelé dès que l’application entrera dans la boucle d’événements du thread dans lequel l’ obj a été créé ou vers lequel il a été déplacé.
- Si type est Qt::BlockingQueuedConnection, la méthode sera appelée de la même manière que pour Qt::QueuedConnection, sauf que le thread actuel se bloquera jusqu’à ce que l’événement soit délivré. L’utilisation de ce type de connexion pour la communication entre des objets d’un même thread entraînera des blocages (deadlocks).
- Si type est Qt::AutoConnection, le membre est appelé de manière synchrone si obj réside dans le même thread que l’appelant ; sinon, il l’appellera de manière asynchrone. C’est le comportement des surcharges qui ne possèdent pas le paramètre type.
Pour appeler de manière asynchrone le slot ` animateClick()` sur un ` QPushButton` :
int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(pushButton, Qt::QueuedConnection);Avec les appels de méthode asynchrones, les paramètres doivent être des types copiables, car Qt doit copier les arguments pour les stocker dans un événement en arrière-plan. Depuis Qt 6.5, cette fonction enregistre automatiquement les types utilisés ; cependant, cela a pour effet secondaire de rendre impossible les appels utilisant des types qui sont uniquement déclarés en avance. De plus, il n’est pas non plus possible d’effectuer des appels asynchrones utilisant comme paramètres des références à des types non qualifiés de `const`.
Pour appeler de manière synchrone le slot ` compute(QString, int, double) ` sur un objet arbitraire ` obj ` et récupérer sa valeur de retour :
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
QString("sqrt"), 42, 9.7);Si le slot « compute » ne prend pas exactement un « QString », un « int » et un « double » dans l’ordre spécifié, l’appel échouera. Notez qu’il a fallu préciser explicitement le type de l’ QString, car le littéral de caractère n’est pas exactement du type requis. Si la méthode prenait à la place un QByteArray, un qint64 et un long double, l’appel devrait s’écrire comme suit :
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QByteArray, qint64, long double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
QByteArray("sqrt"), qint64(42), 9.7L);Le même appel peut être exécuté à l’aide des macros Q_ARG() et Q_RETURN_ARG(), comme suit :
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj,
Qt::DirectConnection,
Q_RETURN_ARG(QString, retVal),
Q_ARG(QString, "sqrt"),
Q_ARG(int, 42),
Q_ARG(double, 9.7));Avertissement : cette méthode ne vérifie pas la validité des arguments : object doit être une instance de la classe de l'QMetaObject à partir de laquelle cet QMetaMethod a été construit.
Ces fonctions ont été introduites dans Qt 6.5.
Voir également Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() et QMetaObject::invokeMethod().
[since 6.5] template <typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
Appelle cette méthode sur un objet de type ` Q_GADGET`. Renvoie ` true ` si le membre a pu être appelé. Renvoie ` false ` si ce membre n'existe pas ou si les paramètres ne correspondent pas.
Le pointeur gadget doit pointer vers une instance de la classe de gadget.
L'appel est toujours synchrone.
Pour la surcharge avec un paramètre QTemplatedMetaMethodReturnArgument, la valeur de retour de l’appel de fonction member est placée dans ret. Pour la surcharge sans ce paramètre, la valeur de retour de la fonction appelée (le cas échéant) sera ignorée. `QTemplatedMetaMethodReturnArgument` est un type interne que vous ne devez pas utiliser directement. Utilisez plutôt la fonction `qReturnArg()`.
Avertissement : cette méthode ne vérifie pas la validité des arguments : ` gadget ` doit être une instance de la classe de l'QMetaObject avec laquelle cette ` QMetaMethod ` a été construite.
Ces fonctions ont été introduites dans Qt 6.5.
Voir également Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() et QMetaObject::invokeMethod().
[since 6.2] bool QMetaMethod::isConst() const
Indique si la méthode est qualifiée de `const`.
Remarque : cette méthode peut renvoyer à tort la valeur « false » pour une méthode « const » si celle-ci appartient à une bibliothèque compilée avec une version antérieure de Qt.
Cette fonction a été introduite dans Qt 6.2.
bool QMetaMethod::isValid() const
Renvoie « true » si cette méthode est valide (peut faire l'objet d'une introspection et être appelée) ; sinon, renvoie « false ».
int QMetaMethod::methodIndex() const
Renvoie l'index de cette méthode.
QByteArray QMetaMethod::methodSignature() const
Renvoie la signature de cette méthode (par exemple, setValue(double)).
Voir également parameterTypes() et parameterNames().
QMetaMethod::MethodType QMetaMethod::methodType() const
Renvoie le type de cette méthode (signal, slot ou méthode).
Voir également access().
QByteArray QMetaMethod::name() const
Renvoie le nom de cette méthode.
Voir également methodSignature() et parameterCount().
[since 6.9] QByteArrayView QMetaMethod::nameView() const
Renvoie le nom de cette méthode. L'QByteArrayView e renvoyée est valide tant que le méta-objet de la classe à laquelle appartient la méthode est valide.
Cette fonction a été introduite dans Qt 6.9.
Voir aussi name.
int QMetaMethod::parameterCount() const
Renvoie le nombre de paramètres de cette méthode.
Voir également parameterType() et parameterNames().
[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const
Renvoie le métatype du paramètre à l'index indiquée.
Si l'index est inférieure à zéro ou supérieure à parameterCount(), un QMetaType invalide est renvoyé.
Cette fonction a été introduite dans Qt 6.0.
Voir également parameterCount(), returnMetaType() et QMetaType.
QList<QByteArray> QMetaMethod::parameterNames() const
Renvoie une liste des noms de paramètres.
Voir également parameterTypes() et methodSignature().
int QMetaMethod::parameterType(int index) const
Renvoie le type du paramètre à l'adresse indiquée : index.
La valeur renvoyée est l'un des types enregistrés auprès de QMetaType, ou QMetaType::UnknownType si le type n'est pas enregistré.
Voir également parameterCount(), parameterMetaType(), returnType() et QMetaType.
[since 6.0] QByteArray QMetaMethod::parameterTypeName(int index) const
Renvoie le nom du type situé à la position index. S'il n'y a pas de paramètre à l'adresse index, renvoie une liste vide QByteArray
Cette fonction a été introduite dans Qt 6.0.
Voir également parameterNames().
QList<QByteArray> QMetaMethod::parameterTypes() const
Renvoie une liste des types de paramètres.
Voir également parameterNames() et methodSignature().
[since 6.0] int QMetaMethod::relativeMethodIndex() const
Renvoie l'index local de cette méthode.
Cette fonction a été introduite dans Qt 6.0.
[since 6.0] QMetaType QMetaMethod::returnMetaType() const
Renvoie le type de retour de cette méthode.
Cette fonction a été introduite dans Qt 6.0.
Voir également parameterMetaType(), QMetaType et typeName().
int QMetaMethod::returnType() const
Renvoie le type de retour de cette méthode.
La valeur de retour correspond à l’un des types enregistrés dans QMetaType, ou dans QMetaType::UnknownType si le type n’est pas enregistré.
Voir également parameterType(), QMetaType, typeName() et returnMetaType().
int QMetaMethod::revision() const
Renvoie la révision de la méthode si celle-ci a été spécifiée par ` Q_REVISION` ; sinon, renvoie 0. Depuis Qt 6.0, les valeurs non nulles sont encodées et peuvent être décodées à l'aide de ` QTypeRevision::fromEncodedVersion()`.
const char *QMetaMethod::tag() const
Renvoie la balise associée à cette méthode.
Les balises sont des macros spéciales reconnues par moc qui permettent d'ajouter des informations supplémentaires sur une méthode.
Les informations de balise peuvent être ajoutées de la manière suivante dans la déclaration de la fonction :
// In the class MainWindow declaration
#ifndef Q_MOC_RUN
// define the tag text as empty, so the compiler doesn't see it
# define MY_CUSTOM_TAG
#endif
//...
private slots:
MY_CUSTOM_TAG void testFunc();et ces informations sont accessibles à l'aide de :
MainWindow win;
win.show();
int functionIndex = win.metaObject()->indexOfSlot("testFunc()");
QMetaMethod mm = win.metaObject()->method(functionIndex);
qDebug() << mm.tag(); // prints MY_CUSTOM_TAGPour l'instant, moc extrait et enregistre toutes les balises, mais n'en traite aucune de manière particulière. Vous pouvez utiliser ces balises pour annoter vos méthodes de différentes manières et les traiter en fonction des besoins spécifiques de votre application.
Remarque : moc développe les macros du préprocesseur ; il est donc nécessaire d’encadrer la définition par #ifndef Q_MOC_RUN , comme indiqué dans l’exemple ci-dessus.
const char *QMetaMethod::typeName() const
Renvoie le nom du type de retour de cette méthode. Si cette méthode est un constructeur, cette fonction renvoie une chaîne vide (les constructeurs n'ont pas de type de retour).
Remarque : dans Qt 7, cette fonction renvoie un pointeur nul pour les constructeurs.
Voir également returnType() et QMetaType::name().
Éléments non membres associés
[noexcept] bool operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
Renvoie « true » si la méthode lhs n'est pas égale à la méthode rhs; sinon, renvoie « false ».
[noexcept] bool operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)
Renvoie « true » si la méthode lhs est égale à la méthode rhs; sinon, renvoie « false ».
Documentation des macros
[until 6.13] Q_METAMETHOD_INVOKE_MAX_ARGS
Cette macro est prévue pour être obsolète à partir de la version 6.13.
Elle correspond au nombre maximal d'arguments disponibles pour l'exécution de la méthode via l'ancienne implémentation de ` QMetaMethod::invoke()`. La nouvelle implémentation (depuis Qt 6.5) utilise des arguments variadiques et ne comporte pas de limite supérieure.
© 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.