Sur cette page

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égorieTypes 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)
bool operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
bool operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)

Macros

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

ConstanteValeur
QMetaMethod::Private0
QMetaMethod::Protected1
QMetaMethod::Public2

enum QMetaMethod::MethodType

ConstanteValeurDescription
QMetaMethod::MethodQMETHOD_CODELa fonction est une fonction membre simple.
QMetaMethod::Signal1La fonction est un signal.
QMetaMethod::Slot2La fonction est un slot.
QMetaMethod::Constructor3La 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_TAG

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