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) |
Verwandte Nicht-Mitglieder
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.
Konstante | Wert |
---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
Konstante | Wert | Beschreibung |
---|---|---|
QMetaMethod::Method | 0 | 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 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.