QMetaMethod Class
Die Klasse „QMetaMethod“ stellt Metadaten zu einer Mitgliedsfunktion bereit. Mehr...
| Header: | #include <QMetaMethod> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Vergleiche von QMetaMethod
| Kategorie | Vergleichbare Typen |
|---|---|
| Gleichheit | QMetaMethod |
Ö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 |
(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 |
Statische öffentliche Elemente
| QMetaMethod | fromSignal(PointerToMemberFunction signal) |
Verwandte Nicht-Mitglieder
| bool | operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs) |
| bool | operator==(const QMetaMethod &lhs, const QMetaMethod &rhs) |
Makros
(until 6.13) | Q_METAMETHOD_INVOKE_MAX_ARGS |
Ausführliche Beschreibung
Eine `QMetaMethod` verfügt über einen ` methodType` (), einen ` methodSignature` (), eine Liste von ` parameterTypes` () und ` parameterNames` (), einen `return typeName` (), einen ` tag` () sowie einen ` access` () -Spezifizierer. Mit ` invoke` () können Sie die Methode für ein beliebiges ` QObject` aufrufen.
Siehe auch QMetaObject, QMetaEnum, QMetaProperty und das Qt-Eigenschaftssystem.
Dokumentation zu Mitgliedstypen
enum QMetaMethod::Access
Diese Enumeration beschreibt die Zugriffsebene einer Methode gemäß den in C++ verwendeten Konventionen.
| Konstante | Wert |
|---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
| Konstante | Wert | Beschreibung |
|---|---|---|
QMetaMethod::Method | QMETHOD_CODE | Die Funktion ist eine einfache Mitgliedsfunktion. |
QMetaMethod::Signal | 1 | Die Funktion ist ein Signal. |
QMetaMethod::Slot | 2 | Die Funktion ist ein Slot. |
QMetaMethod::Constructor | 3 | Die Funktion ist ein Konstruktor. |
Dokumentation zur Mitgliedsfunktion
QMetaMethod::Access QMetaMethod::access() const
Gibt die Zugriffsspecifikation dieser Methode zurück (private, protected oder public).
Hinweis: Signale sind immer öffentlich, aber Sie sollten dies als Implementierungsdetail betrachten. Es ist fast immer eine schlechte Idee, ein Signal von außerhalb der Klasse aus auszulösen.
Siehe auch ` methodType()`.
[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
Gibt die Metamethode zurück, die dem angegebenen ` signal` entspricht, oder einen ungültigen ` QMetaMethod `, falls ` signal ` ` nullptr ` ist oder kein Signal der Klasse darstellt.
Beispiel:
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
Ruft diese Methode für das Objekt ` object` auf. Gibt ` true ` zurück, wenn das Element aufgerufen werden konnte. Gibt ` false ` zurück, wenn kein solches Element vorhanden ist oder die Parameter nicht übereinstimmen.
Bei den Überladungen mit einem `QTemplatedMetaMethodReturnArgument`-Parameter wird der Rückgabewert des Funktionsaufrufs ` member ` in ` ret` gespeichert. 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 Parameter ` Qt::ConnectionType ` ` type ` ermöglichen die explizite Auswahl, ob der Aufruf synchron erfolgen soll oder nicht:
- Ist ` type ` gleich ` Qt::DirectConnection`, wird das Element sofort im aktuellen Thread aufgerufen.
- Ist ` type ` auf ` Qt::QueuedConnection` gesetzt, wird ein ` QEvent ` gesendet und das Element wird aufgerufen, sobald die Anwendung in den Ereignisschleife des Threads eintritt, in dem das ` obj ` erstellt oder verschoben wurde.
- Ist type gleich Qt::BlockingQueuedConnection, wird die Methode auf dieselbe Weise wie bei Qt::QueuedConnection aufgerufen, mit dem Unterschied, dass der aktuelle Thread blockiert, bis das Ereignis übermittelt wird. Die Verwendung dieses Verbindungstyps zur Kommunikation zwischen Objekten im selben Thread führt zu Deadlocks.
- Ist ` type ` gleich ` Qt::AutoConnection`, wird das Mitglied synchron aufgerufen, wenn sich ` obj ` im selben Thread wie der Aufrufer befindet; andernfalls wird das Mitglied asynchron aufgerufen. Dies ist das Verhalten der Überladungen, die keinen ` type `-Parameter haben.
So rufen Sie den Slot „ animateClick()“ auf einem „ QPushButton “ asynchron auf:
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 im Hintergrund in einem Ereignis zu speichern. Seit Qt 6.5 registriert diese Funktion die verwendeten Typen automatisch; als Nebeneffekt ist es jedoch nicht möglich, Aufrufe mit Typen durchzuführen, die nur vorwärtsdeklariert sind. Außerdem ist es nicht möglich, asynchrone Aufrufe durchzuführen, die Referenzen auf nicht als `const` qualifizierte Typen als Parameter verwenden.
Um den Slot „ compute(QString, int, double) “ synchron für ein beliebiges Objekt „ obj “ aufzurufen und dessen Rückgabewert abzurufen:
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 Slot „compute“ nicht genau ein ` QString`, ein ` int` und ein ` double ` in der angegebenen Reihenfolge akzeptiert, schlägt der Aufruf fehl. Beachten Sie, dass der Typ von „ QString “ explizit angegeben werden musste, da das Zeichenliteral nicht genau dem passenden Typ entspricht. Würde die Methode stattdessen einen „ QByteArray “, einen „ qint64 “ und einen „ long double “ erwarten, 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);Der gleiche Aufruf kann mithilfe der 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: Bei dieser Methode wird die Gültigkeit der Argumente nicht überprüft: ` object ` muss eine Instanz der Klasse sein, aus der der ` QMetaObject ` konstruiert wurde, mit dem dieser ` QMetaMethod ` erstellt wurde.
Diese Funktionen wurden 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 für ein ` Q_GADGET` auf. Gibt ` true ` zurück, wenn das Mitglied aufgerufen werden konnte. Gibt ` false ` zurück, wenn kein solches Mitglied vorhanden ist oder die Parameter nicht übereinstimmen.
Der Zeiger ` gadget ` muss auf eine Instanz der Gadget-Klasse zeigen.
Der Aufruf erfolgt immer synchron.
Bei der Überladung mit einem „QTemplatedMetaMethodReturnArgument“-Parameter wird der Rückgabewert des Funktionsaufrufs „ member “ in „ ret “ gespeichert. 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()`.
Warnung: Diese Methode prüft nicht die Gültigkeit der Argumente: ` gadget ` muss eine Instanz der Klasse von ` QMetaObject ` sein, mit der diese ` QMetaMethod ` erstellt wurde.
Diese Funktionen wurden in Qt 6.5 eingeführt.
Siehe auch Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() und QMetaObject::invokeMethod().
[since 6.2] bool QMetaMethod::isConst() const
Gibt zurück, ob die Methode als „const“ deklariert ist.
Hinweis: Diese Methode gibt möglicherweise fälschlicherweise „ false “ für eine „const“-Methode zurück, wenn diese 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 introspiziert 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().
[since 6.9] QByteArrayView QMetaMethod::nameView() const
Gibt den Namen dieser Methode zurück. Das zurückgegebene ` QByteArrayView ` ist gültig, solange das Metaobjekt der Klasse, zu der die Methode gehört, gültig ist.
Diese Funktion wurde in Qt 6.9 eingeführt.
Siehe auch ` name`.
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 unter der angegebenen Adresse index zurück.
Ist der ` index ` kleiner als Null oder größer als ` parameterCount()`, wird ein ungültiger ` 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 mit Parameternamen zurück.
Siehe auch parameterTypes() und methodSignature().
int QMetaMethod::parameterType(int index) const
Gibt den Typ des Parameters unter der angegebenen Adresse index zurück.
Der Rückgabewert ist einer der bei ` QMetaType` registrierten Typen oder ` QMetaType::UnknownType `, falls 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. Befindet sich an der Position „ index “ kein Parameter, wird ein leeres QByteArray
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch parameterNames().
QList<QByteArray> QMetaMethod::parameterTypes() const
Gibt eine Liste der Parametertypen zurück.
Siehe auch parameterNames() und methodSignature().
[since 6.0] int QMetaMethod::relativeMethodIndex() const
Gibt den lokalen Index 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, falls der Typ nicht registriert ist.
Siehe auch parameterType(), QMetaType, typeName() und returnMetaType().
int QMetaMethod::revision() const
Gibt die Methodenrevision zurück, sofern eine solche über ` Q_REVISION` angegeben wurde; andernfalls wird 0 zurückgegeben. Seit Qt 6.0 werden Werte ungleich Null kodiert und können mit ` QTypeRevision::fromEncodedVersion()` dekodiert werden.
const char *QMetaMethod::tag() const
Gibt das dieser Methode zugeordnete Tag zurück.
Tags sind spezielle Makros, die von moc erkannt werden und es ermöglichen, zusätzliche Informationen zu einer Methode hinzuzufügen.
Tag-Informationen können auf folgende Weise in die Funktionsdeklaration eingefü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 wie folgt zugegriffen werden:
MainWindow win;
win.show();
int functionIndex = win.metaObject()->indexOfSlot("testFunc()");
QMetaMethod mm = win.metaObject()->method(functionIndex);
qDebug() << mm.tag(); // prints MY_CUSTOM_TAGDerzeit extrahiert und protokolliert „ moc “ zwar alle Tags, behandelt diese jedoch nicht auf besondere Weise. Sie können die Tags verwenden, um Ihre Methoden unterschiedlich zu kennzeichnen, und sie entsprechend den spezifischen Anforderungen Ihrer Anwendung behandeln.
Hinweis: „ moc “ expandiert Präprozessor-Makros, daher ist es notwendig, die Definition mit „ #ifndef “ und „ Q_MOC_RUN “ zu umschließen, wie im obigen Beispiel gezeigt.
const char *QMetaMethod::typeName() const
Gibt den Namen des Rückgabetyps dieser Methode zurück. Handelt es sich bei dieser Methode um einen Konstruktor, gibt diese Funktion eine leere Zeichenkette zurück (Konstruktoren haben keinen Rückgabetyp).
Hinweis: In Qt 7 gibt diese Funktion für Konstruktoren einen Nullzeiger zurück.
Siehe auch „ returnType()“ und „ QMetaType::name()“.
Verwandte Nicht-Mitglieder
[noexcept] bool operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
Gibt „ true “ zurück, wenn die Methode „ lhs “ nicht mit der Methode „ rhs “ übereinstimmt; andernfalls wird „ false “ zurückgegeben.
[noexcept] bool operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)
Gibt „ true “ zurück, wenn die Methode „ lhs “ mit der Methode „ rhs “ übereinstimmt; andernfalls wird „ false “ zurückgegeben.
Makro-Dokumentation
[until 6.13] Q_METAMETHOD_INVOKE_MAX_ARGS
Dieses Makro wird in Version 6.13 als veraltet markiert.
Entspricht der maximalen Anzahl von Argumenten, die für die Ausführung der Methode über die alte Implementierung von ` QMetaMethod::invoke()` zur Verfügung stehen. Die neue Implementierung (seit Qt 6.5) verwendet variadische Argumente und kennt keine Obergrenze.
© 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.