QMetaMethod Class

Die Klasse QMetaMethod liefert Metadaten über eine Mitgliedsfunktion. Mehr...

Kopfzeile: #include <QMetaMethod>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Diese Klasse ist gleichwertig vergleichbar.

Öffentliche Typen

enum Access { Private, Protected, Public }
enum MethodType { Method, Signal, Slot, Constructor }

Öffentliche Funktionen

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

Statische öffentliche Mitglieder

QMetaMethod fromSignal(PointerToMemberFunction signal)
bool operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
bool operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)

Makros

Detaillierte Beschreibung

Eine QMetaMethod hat einen methodType(), einen methodSignature(), eine Liste von parameterTypes() und parameterNames(), einen return typeName(), einen tag() und einen access() specifier. Sie können invoke() verwenden, um die Methode auf einem beliebigen QObject aufzurufen.

Siehe auch QMetaObject, QMetaEnum, QMetaProperty, und Qt's Property System.

Member-Typ Dokumentation

enum QMetaMethod::Access

Diese Aufzählung beschreibt die Zugriffsebene einer Methode, entsprechend den in C++ verwendeten Konventionen.

KonstanteWert
QMetaMethod::Private0
QMetaMethod::Protected1
QMetaMethod::Public2

enum QMetaMethod::MethodType

KonstanteWertBeschreibung
QMetaMethod::Method0Die Funktion ist eine einfache Mitgliedsfunktion.
QMetaMethod::Signal1Die Funktion ist ein Signal.
QMetaMethod::Slot2Die Funktion ist ein Slot.
QMetaMethod::Constructor3Die Funktion ist ein Konstruktor.

Dokumentation der Mitgliedsfunktion

[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

Ruft diese Methode für das Objekt object auf. Gibt true zurück, wenn das Mitglied aufgerufen werden konnte. Gibt false zurück, wenn es kein solches Mitglied gibt oder die Parameter nicht übereinstimmen.

Bei den Überladungen mit einem QTemplatedMetaMethodReturnArgument-Parameter wird der Rückgabewert des member Funktionsaufrufs in ret abgelegt. Bei den Überladungen ohne ein solches Mitglied wird der Rückgabewert der aufgerufenen Funktion (falls vorhanden) verworfen. QTemplatedMetaMethodReturnArgument ist ein interner Typ, den Sie nicht direkt verwenden sollten. Verwenden Sie stattdessen die Funktion qReturnArg().

Die Überladungen mit einem Qt::ConnectionType type Parameter erlauben die explizite Auswahl, ob der Aufruf synchron sein soll oder nicht:

  • Wenn type gleich Qt::DirectConnection ist, wird das Element sofort im aktuellen Thread aufgerufen.
  • Wenn type Qt::QueuedConnection ist, wird ein QEvent gesendet und das Mitglied wird aufgerufen, sobald die Anwendung in die Ereignisschleife des Threads eintritt, in dem obj erstellt oder verschoben wurde.
  • Wenn type Qt::BlockingQueuedConnection ist, wird die Methode auf die gleiche Weise wie bei Qt::QueuedConnection aufgerufen, mit der Ausnahme, dass der aktuelle Thread blockiert wird, bis das Ereignis geliefert wird. Die Verwendung dieses Verbindungstyps für die Kommunikation zwischen Objekten im selben Thread führt zu Deadlocks.
  • Wenn type Qt::AutoConnection ist, wird das Mitglied synchron aufgerufen, wenn obj im gleichen Thread wie der Aufrufer lebt; andernfalls wird das Mitglied asynchron aufgerufen. Dies ist das Verhalten der Überladungen, die den Parameter type nicht haben.

Asynchroner Aufruf des animateClick()-Slots auf einem QPushButton:

int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(pushButton, Qt::QueuedConnection);

Bei asynchronen Methodenaufrufen müssen die Parameter kopierbare Typen sein, da Qt die Argumente kopieren muss, um sie hinter den Kulissen in einem Ereignis zu speichern. Seit Qt 6.5 registriert diese Funktion automatisch die verwendeten Typen; als Nebeneffekt ist es jedoch nicht möglich, Aufrufe mit Typen zu machen, die nur forward-declared sind. Darüber hinaus ist es auch nicht möglich, asynchrone Aufrufe zu machen, die Referenzen auf nicht-konst-qualifizierte Typen als Parameter verwenden.

Der synchrone Aufruf des compute(QString, int, double) Slots auf ein beliebiges Objekt obj ruft dessen Rückgabewert ab:

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);

Wenn der "compute"-Slot nicht genau einen QString, einen int und einen double in der angegebenen Reihenfolge annimmt, schlägt der Aufruf fehl. Beachten Sie, dass der Typ des QString explizit angegeben werden musste, da das Zeichenliteral nicht genau der richtige Typ für die Übereinstimmung ist. Wenn die Methode stattdessen ein QByteArray, ein qint64 und ein long double annehmen würde, müsste der Aufruf wie folgt geschrieben werden:

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);

Derselbe Aufruf kann mit den Makros Q_ARG() und Q_RETURN_ARG() ausgeführt werden, wie in:

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));

Warnung: Diese Methode prüft nicht die Gültigkeit der Argumente: object muss eine Instanz der Klasse QMetaObject sein, mit der dieses QMetaMethod konstruiert wurde.

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), und 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

Ruft diese Methode auf einem Q_GADGET auf. Gibt true zurück, wenn das Mitglied aufgerufen werden konnte. Gibt false zurück, wenn es kein solches Mitglied gibt oder die Parameter nicht übereinstimmen.

Der Zeiger gadget muss auf eine Instanz der Gadget-Klasse zeigen.

Der Aufruf ist immer synchron.

Für die Überladung mit einem QTemplatedMetaMethodReturnArgument-Parameter wird der Rückgabewert des member Funktionsaufrufs in ret abgelegt. Bei der Überladung ohne diesen Parameter wird der Rückgabewert der aufgerufenen Funktion (falls vorhanden) verworfen. QTemplatedMetaMethodReturnArgument ist ein interner Typ, den Sie nicht direkt verwenden sollten. Verwenden Sie stattdessen die Funktion qReturnArg().

Achtung: diese Methode prüft nicht die Gültigkeit der Argumente: gadget muss eine Instanz der Klasse QMetaObject sein, mit der dieses QMetaMethod konstruiert wurde.

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), und QMetaObject::invokeMethod().

QMetaMethod::Access QMetaMethod::access() const

Gibt die Zugriffsspezifikation dieser Methode zurück (privat, geschützt oder öffentlich).

Hinweis: Signale sind immer öffentlich, aber Sie sollten dies als Implementierungsdetail betrachten. Es ist fast immer eine schlechte Idee, ein Signal von außerhalb seiner Klasse auszusenden.

Siehe auch methodType().

[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)

Gibt die Meta-Methode zurück, die der angegebenen signal entspricht, oder eine ungültige QMetaMethod, wenn signal nullptr oder kein Signal der Klasse ist.

Beispiel:

QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);

[since 6.2] bool QMetaMethod::isConst() const

Gibt zurück, ob die Methode const qualifiziert ist.

Hinweis: Diese Methode kann fälschlicherweise false für eine const-Methode zurückgeben, wenn sie zu einer Bibliothek gehört, die gegen eine ältere Version von Qt kompiliert wurde.

Diese Funktion wurde in Qt 6.2 eingeführt.

bool QMetaMethod::isValid() const

Gibt true zurück, wenn diese Methode gültig ist (kann introspektiert und aufgerufen werden), andernfalls wird false zurückgegeben.

int QMetaMethod::methodIndex() const

Gibt den Index dieser Methode zurück.

QByteArray QMetaMethod::methodSignature() const

Gibt die Signatur dieser Methode zurück (z. B. setValue(double)).

Siehe auch parameterTypes() und parameterNames().

QMetaMethod::MethodType QMetaMethod::methodType() const

Gibt den Typ dieser Methode zurück (Signal, Slot oder Methode).

Siehe auch access().

QByteArray QMetaMethod::name() const

Gibt den Namen dieser Methode zurück.

Siehe auch methodSignature() und parameterCount().

int QMetaMethod::parameterCount() const

Gibt die Anzahl der Parameter dieser Methode zurück.

Siehe auch parameterType() und parameterNames().

[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const

Gibt den Metatyp des Parameters an der angegebenen index zurück.

Wenn index kleiner als Null oder größer als parameterCount() ist, wird ein ungültiges QMetaType zurückgegeben.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch parameterCount(), returnMetaType(), und QMetaType.

QList<QByteArray> QMetaMethod::parameterNames() const

Gibt eine Liste von Parameternamen zurück.

Siehe auch parameterTypes() und methodSignature().

int QMetaMethod::parameterType(int index) const

Gibt den Typ des Parameters auf der angegebenen index zurück.

Der Rückgabewert ist einer der Typen, die bei QMetaType registriert sind, oder QMetaType::UnknownType, wenn der Typ nicht registriert ist.

Siehe auch parameterCount(), parameterMetaType(), returnType(), und QMetaType.

[since 6.0] QByteArray QMetaMethod::parameterTypeName(int index) const

Gibt den Namen des Typs an der Position index zurück. Wenn es keinen Parameter an index gibt, wird ein leeres QByteArray

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch parameterNames().

QList<QByteArray> QMetaMethod::parameterTypes() const

Gibt eine Liste von Parametertypen zurück.

Siehe auch parameterNames() und methodSignature().

[since 6.0] int QMetaMethod::relativeMethodIndex() const

Gibt den lokalen Index innerhalb dieser Methode zurück.

Diese Funktion wurde in Qt 6.0 eingeführt.

[since 6.0] QMetaType QMetaMethod::returnMetaType() const

Gibt den Rückgabetyp dieser Methode zurück.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch parameterMetaType(), QMetaType, und typeName().

int QMetaMethod::returnType() const

Gibt den Rückgabetyp dieser Methode zurück.

Der Rückgabewert ist einer der Typen, die unter QMetaType registriert sind, oder QMetaType::UnknownType, wenn der Typ nicht registriert ist.

Siehe auch parameterType(), QMetaType, typeName(), und returnMetaType().

int QMetaMethod::revision() const

Gibt die Methodenrevision zurück, wenn eine durch Q_REVISION angegeben wurde, andernfalls wird 0 zurückgegeben. Seit Qt 6.0 werden Werte, die nicht Null sind, kodiert und können mit QTypeRevision::fromEncodedVersion() dekodiert werden.

const char *QMetaMethod::tag() const

Gibt den mit dieser Methode verbundenen Tag zurück.

Tags sind spezielle Makros, die von moc erkannt werden und es ermöglichen, zusätzliche Informationen über eine Methode hinzuzufügen.

Tag-Informationen können auf folgende Weise in der Funktionsdeklaration hinzugefügt werden:

    // 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();

und auf die Informationen kann mit Hilfe von zugegriffen werden:

    MainWindow win; win.show(); int functionIndex = win.metaObject()->indexOfSlot("testFunc()"); QMetaMethod mm = win.metaObject()->method(functionIndex);    qDebug() << mm.tag(); // prints MY_CUSTOM_TAG

Im Moment extrahiert und speichert moc alle Tags, aber es behandelt keine von ihnen speziell. Sie können die Tags verwenden, um Ihre Methoden anders zu kennzeichnen und sie entsprechend den spezifischen Anforderungen Ihrer Anwendung zu behandeln.

Hinweis: moc expandiert Präprozessormakros, daher ist es notwendig, die Definition mit #ifndef Q_MOC_RUN zu umgeben, wie im obigen Beispiel gezeigt.

const char *QMetaMethod::typeName() const

Gibt den Namen des Rückgabetyps dieser Methode zurück.

Siehe auch returnType() und QMetaType::type().

Verwandte Nicht-Mitglieder

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

Dies ist eine überladene Funktion.

Gibt true zurück, wenn die Methode lhs nicht gleich der Methode rhs ist, andernfalls gibt sie false zurück.

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

Dies ist eine überladene Funktion.

Gibt true zurück, wenn die Methode lhs gleich der Methode rhs ist, andernfalls gibt sie false zurück.

Makro-Dokumentation

Q_METAMETHOD_INVOKE_MAX_ARGS

Entspricht der maximalen Anzahl der Argumente, die für die Ausführung der Methode über QMetaMethod::invoke() zur Verfügung stehen

© 2025 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.