QMetaMethod Class
La classe QMetaMethod fournit des métadonnées sur une fonction membre. Plus d'informations...
| En-tête : | #include <QMetaMethod> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
Cette classe est comparable à l'égalité.
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) |
Non-membres apparentés
| bool | operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs) |
| bool | operator==(const QMetaMethod &lhs, const QMetaMethod &rhs) |
Macros
Description détaillée
Une QMetaMethod possède un methodType(), un methodSignature(), une liste de parameterTypes() et parameterNames(), un retour typeName(), un tag() et un spécificateur access(). Vous pouvez utiliser invoke() pour invoquer la méthode sur un QObject arbitraire.
Voir aussi 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, en suivant les conventions utilisées en C++.
| Constante | Valeur |
|---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
| Constante | Valeur | Description de la fonction |
|---|---|---|
QMetaMethod::Method | QMETHOD_CODE | La fonction est une fonction membre ordinaire. |
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 la spécification d'accès de cette méthode (privée, protégée ou publique).
Remarque : les signaux sont toujours publics, mais il s'agit là d'un détail d'implémentation. C'est presque toujours une mauvaise idée d'émettre un signal en dehors de sa classe.
Voir également methodType().
[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
Renvoie la méta-méthode correspondant à l'adresse signal, ou une adresse QMetaMethod invalide 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 ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, 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, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
[since 6.5] template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Args &&... arguments) const
Invoque cette méthode sur l'objet object. Renvoie true si le membre a pu être invoqué. Retourne false s'il n'existe pas de membre de ce type ou si les paramètres ne correspondent pas.
Pour les surcharges avec un paramètre QTemplatedMetaMethodReturnArgument, la valeur de retour de l'appel de la fonction member est placée dans ret. Pour les surcharges sans ce type de membre, la valeur de retour de la fonction appelée (s'il y en a une) sera rejetée. QTemplatedMetaMethodReturnArgument est un type interne que vous ne devez pas utiliser directement. Utilisez plutôt la fonction qReturnArg().
Les surcharges avec un paramètre Qt::ConnectionType type permettent de choisir explicitement si l'invocation sera synchrone ou non :
- Si type est Qt::DirectConnection, le membre sera invoqué immédiatement dans le thread courant.
- Si type est Qt::QueuedConnection, un QEvent sera envoyé et le membre sera invoqué dès que l'application entrera dans la boucle d'événements dans le thread dans lequel le obj a été créé ou a été déplacé.
- Si type est Qt::BlockingQueuedConnection, la méthode sera invoquée de la même manière que pour Qt::QueuedConnection, sauf que le thread en cours sera bloqué jusqu'à ce que l'événement soit délivré. L'utilisation de ce type de connexion pour communiquer entre des objets dans le même thread conduira à des blocages.
- Si type est Qt::AutoConnection, le membre est invoqué de manière synchrone si obj vit dans le même thread que l'appelant ; sinon, il invoquera le membre de manière asynchrone. C'est le comportement des surcharges qui n'ont pas le paramètre type.
Pour invoquer 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 invocations de méthodes asynchrones, les paramètres doivent être des types copiables, car Qt a besoin de copier les arguments pour les stocker dans un événement dans les coulisses. Depuis Qt 6.5, cette fonction enregistre automatiquement les types utilisés ; cependant, il n'est pas possible d'effectuer des appels en utilisant des types qui ne sont déclarés que par anticipation. En outre, 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 par des conventions.
Pour invoquer de manière synchrone le slot compute(QString, int, double) sur un objet arbitraire, obj récupère 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 était nécessaire d'être explicite sur le type de QString, car le littéral de caractère n'est pas exactement le bon type pour correspondre. Si la méthode prenait plutôt un QByteArray, un qint64, et un long double, l'appel devrait être écrit 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));
Attention : cette méthode ne teste pas la validité des arguments : object doit être une instance de la classe de QMetaObject avec laquelle ce QMetaMethod a été construit.
Ces fonctions ont été introduites dans Qt 6.5.
Voir aussi Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() et QMetaObject::invokeMethod().
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
[since 6.5] template <typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, Args &&... arguments) const
Invoque cette méthode sur un Q_GADGET. Renvoie true si le membre a pu être invoqué. Retourne false si ce membre n'existe pas ou si les paramètres ne correspondent pas.
Le pointeur gadget doit pointer sur une instance de la classe de gadget.
L'invocation 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 paramètre, la valeur de retour de la fonction appelée (s'il y en a une) sera rejetée. QTemplatedMetaMethodReturnArgument est un type interne que vous ne devez pas utiliser directement. Utilisez plutôt la fonction qReturnArg().
Attention : cette méthode ne teste pas la validité des arguments : gadget doit être une instance de la classe de QMetaObject avec laquelle ce QMetaMethod a été construit.
Ces fonctions ont été introduites dans Qt 6.5.
Voir aussi Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), et QMetaObject::invokeMethod().
[since 6.2] bool QMetaMethod::isConst() const
Retourne si la méthode est qualifiée const.
Note : Cette méthode peut renvoyer par erreur false pour une méthode const si elle appartient à une bibliothèque compilée avec une ancienne version de Qt.
Cette fonction a été introduite dans Qt 6.2.
bool QMetaMethod::isValid() const
Renvoie true si cette méthode est valide (peut être introspectée et invoqué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 aussi parameterTypes() et parameterNames().
QMetaMethod::MethodType QMetaMethod::methodType() const
Renvoie le type de cette méthode (signal, slot ou méthode).
Voir aussi access().
QByteArray QMetaMethod::name() const
Renvoie le nom de cette méthode.
Voir aussi methodSignature() et parameterCount().
[since 6.9] QByteArrayView QMetaMethod::nameView() const
Renvoie le nom de cette méthode. L'adresse QByteArrayView renvoyée est valide tant que le méta-objet de la classe à laquelle la méthode appartient 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 aussi parameterType() et parameterNames().
[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const
Renvoie le métatype du paramètre à l'adresse index.
Si index est plus petit que zéro ou plus grand que parameterCount(), une QMetaType invalide est renvoyée.
Cette fonction a été introduite dans Qt 6.0.
Voir aussi parameterCount(), returnMetaType(), et QMetaType.
QList<QByteArray> QMetaMethod::parameterNames() const
Renvoie une liste de noms de paramètres.
Voir aussi parameterTypes() et methodSignature().
int QMetaMethod::parameterType(int index) const
Renvoie le type du paramètre à l'adresse index.
La valeur de retour est l'un des types enregistrés sur QMetaType, ou QMetaType::UnknownType si le type n'est pas enregistré.
Voir aussi parameterCount(), parameterMetaType(), returnType() et QMetaType.
[since 6.0] QByteArray QMetaMethod::parameterTypeName(int index) const
Renvoie le nom du type à la position index S'il n'y a pas de paramètre à index, renvoie un champ vide. QByteArray
Cette fonction a été introduite dans Qt 6.0.
Voir aussi parameterNames().
QList<QByteArray> QMetaMethod::parameterTypes() const
Renvoie une liste de types de paramètres.
Voir aussi parameterNames() et methodSignature().
[since 6.0] int QMetaMethod::relativeMethodIndex() const
Renvoie l'index local de cette méthode à l'intérieur.
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 aussi parameterMetaType(), QMetaType, et typeName().
int QMetaMethod::returnType() const
Renvoie le type de retour de cette méthode.
La valeur de retour est l'un des types enregistrés sur QMetaType, ou QMetaType::UnknownType si le type n'est pas enregistré.
Voir aussi parameterType(), QMetaType, typeName() et returnMetaType().
int QMetaMethod::revision() const
Renvoie la révision de la méthode si elle 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 tags sont des macros spéciales reconnues par moc qui permettent d'ajouter des informations supplémentaires sur une méthode.
Les informations relatives aux balises 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 les informations peuvent être consultées en utilisant :
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 extraira et enregistrera toutes les balises, mais ne traitera aucune d'entre elles de manière spécifique. Vous pouvez utiliser les balises pour annoter vos méthodes différemment et les traiter en fonction des besoins spécifiques de votre application.
Note : moc développe les macros du préprocesseur, il est donc nécessaire d'entourer la définition avec #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 aussi returnType() et QMetaType::name().
Non-membres apparenté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 sur les macros
Q_METAMETHOD_INVOKE_MAX_ARGS
Est égal au nombre maximum d'arguments disponibles pour l'exécution de la méthode via QMetaMethod::invoke()
© 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.