Класс QMetaMethod
Класс QMetaMethod предоставляет метаданные о членной функции. Подробнее...
| Заголовок: | #include <QMetaMethod> |
| qmake: | QT += core |
Типы public
| перечисление | Access { Private, Protected, Public } |
| перечисление | MethodType { Method, Signal, Slot, Constructor } |
Функции public
| QMetaMethod::Access | access() const |
| bool | invoke(QObject *object, Qt::ConnectionType connectionType, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const |
| bool | invoke(QObject *object, QGenericReturnArgument returnValue, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const |
| bool | invoke(QObject *object, Qt::ConnectionType connectionType, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const |
| bool | invoke(QObject *object, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const |
| bool | invokeOnGadget(void *gadget, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const |
| bool | invokeOnGadget(void *gadget, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const |
| bool | isValid() const |
| int | methodIndex() const |
| QByteArray | methodSignature() const |
| QMetaMethod::MethodType | methodType() const |
| QByteArray | name() const |
| int | parameterCount() const |
| QList<QByteArray> | parameterNames() const |
| int | parameterType(int index) const |
| QList<QByteArray> | parameterTypes() const |
| int | returnType() const |
| int | revision() const |
| const char * | tag() const |
| const char * | typeName() const |
Статические члены public
| QMetaMethod | fromSignal(PointerToMemberFunction signal) |
Связанные нечлены
| bool | operator!=(const QMetaMethod &m1, const QMetaMethod &m2) |
| bool | operator==(const QMetaMethod &m1, const QMetaMethod &m2) |
Макросы
| Q_METAMETHOD_INVOKE_MAX_ARGS |
Подробное описание
Класс QMetaMethod предоставляет метаданные о методе-члене.
Класс QMetaMethod содержит метод methodType(), метод methodSignature(), список методов parameterTypes() и parameterNames(), возвращаемый тип typeName(), атрибут tag() и спецификатор доступа access(). Вы можете использовать метод invoke() для вызова метода на произвольном объекте QObject.
См. также QMetaObject, QMetaEnum, QMetaProperty и Систему свойств Qt.
Документация типов членов
enum QMetaMethod::Access
Этот перечисление описывает уровень доступа к методу, следуя соглашениям, используемым в C++.
| Постоянная | Значение |
|---|---|
QMetaMethod::Private |
0 |
QMetaMethod::Protected |
1 |
QMetaMethod::Public |
2 |
enum QMetaMethod::MethodType
| Постоянная | Значение | Описание |
|---|---|---|
QMetaMethod::Method |
0 |
Функция является обычным членом-функцией. |
QMetaMethod::Signal |
1 |
Функция является сигналом. |
QMetaMethod::Slot |
2 |
Функция является слотом. |
QMetaMethod::Constructor |
3 |
Функция является конструктором. |
Документация функций-членов
QMetaMethod::Access QMetaMethod::access() const
Возвращает спецификатор доступа к этому методу (private, protected или public).
Примечание: Сигналы всегда являются public, но это следует рассматривать как деталь реализации. Практически всегда плохая идея генерировать сигнал извне своего класса.
См. также methodType().
[static] QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
Возвращает мета-метод, соответствующий заданному signal, или недействительный QMetaMethod, если signal не является сигналом класса.
Пример:
QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);
Эта функция была добавлена в Qt 5.0.
bool QMetaMethod::invoke(QObject *object, Qt::ConnectionType connectionType, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const
Вызывает этот метод для объекта object. Возвращает true если член можно вызвать. Возвращает false если члена нет или параметры не совпадают.
Вызов может быть синхронным или асинхронным, в зависимости от connectionType:
- Если connectionType равен Qt::DirectConnection, член вызывается немедленно.
- Если connectionType равен Qt::QueuedConnection, будет отправлено событие QEvent, и член вызывается, как только приложение войдёт в главный цикл событий.
- Если connectionType равен Qt::AutoConnection, член вызывается синхронно, если object находится в том же потоке, что и вызывающий код; в противном случае он вызовет член асинхронно.
Возвращаемое значение этого вызова метода помещается в returnValue. Если вызов асинхронный, возвращаемое значение нельзя оценить. Вы можете передать до десяти аргументов (val0, val1, val2, val3, val4, val5, val6, val7, val8 и val9) в этот вызов метода.
QGenericArgument и QGenericReturnArgument — это внутренние вспомогательные классы. Поскольку сигналы и слоты могут вызываться динамически, аргументы должны быть заключены в макросы Q_ARG() и Q_RETURN_ARG(). Q_ARG() принимает имя типа и константную ссылку на этот тип; Q_RETURN_ARG() принимает имя типа и ссылку без const.
Для асинхронного вызова слота animateClick() на кнопке QPushButton:
int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(pushButton, Qt::QueuedConnection); При асинхронных вызовах методов параметры должны быть типов, известные системе метаобъектов Qt, поскольку Qt нужно скопировать аргументы для их хранения в событии.
QMetaMethod::invoke: Unable to handle unregistered datatype 'MyType'
Вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных, прежде чем вызывать QMetaMethod::invoke().
Для синхронного вызова слота compute(QString, int, double) на произвольном объекте obj и получения его возвращаемого значения:
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)); QMetaObject::normalizedSignature() используется здесь для обеспечения того, что формат сигнатуры соответствует тому, что ожидает invoke(). Например, удаляются лишние пробелы.
Если слот "compute" не принимает ровно один QString, одно целое число и одно число с плавающей точкой в указанном порядке, вызов завершится неудачей.
Предупреждение: этот метод не проверяет корректность аргументов: object должен быть экземпляром класса, к которому относится QMetaObject, с помощью которого был создан QMetaMethod. Аргументы должны иметь тот же тип, что и ожидаемый методом, в противном случае поведение не определено.
См. также Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), и QMetaObject::invokeMethod().
bool QMetaMethod::invoke(QObject *object, QGenericReturnArgument returnValue, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const
Эта функция перегружает invoke().
Этот перегруз всегда вызывает этот метод с помощью типа соединения Qt::AutoConnection.
bool QMetaMethod::invoke(QObject *object, Qt::ConnectionType connectionType, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const
Эта функция перегружает invoke().
Этот перегруз может быть использован, если возвращаемое значение члена не требуется.
bool QMetaMethod::invoke(QObject *object, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const
Эта функция перегружает invoke().
Этот перегруз вызывает этот метод с типом соединения Qt::AutoConnection и игнорирует возвращаемые значения.
bool QMetaMethod::invokeOnGadget(void *gadget, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const
Вызывает этот метод на Q_GADGET. Возвращает true если член можно вызвать. Возвращает false если члена нет или параметры не совпадают.
Указатель gadget должен указывать на экземпляр класса устройства.
Вызов всегда синхронный.
Возвращаемое значение этого вызова метода помещается в returnValue. Вы можете передать до десяти аргументов (val0, val1, val2, val3, val4, val5, val6, val7, val8 и val9) в этот вызов метода.
Предупреждение: этот метод не проверяет валидность аргументов: gadget должен быть экземпляром класса QMetaObject, с которым был создан данный QMetaMethod. Аргументы должны иметь тот же тип, что и ожидаемые методом, иначе поведение не определено.
Эта функция была добавлена в Qt 5.5.
См. также Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() и QMetaObject::invokeMethod().
bool QMetaMethod::invokeOnGadget(void *gadget, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...) const
Это перегруженная функция.
Этот перегруз вызывает этот метод для gadget и игнорирует возвращаемые значения.
Эта функция была добавлена в Qt 5.5.
bool QMetaMethod::isValid() const
Возвращает true , если этот метод валиден (может быть проинспектирован и вызван), в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
int QMetaMethod::methodIndex() const
Возвращает индекс этого метода.
Эта функция была добавлена в Qt 4.6.
QByteArray QMetaMethod::methodSignature() const
Возвращает сигнатуру этого метода (например, setValue(double)).
Эта функция была добавлена в Qt 5.0.
См. также parameterTypes() и parameterNames().
QMetaMethod::MethodType QMetaMethod::methodType() const
Возвращает тип этого метода (сигнал, слот или метод).
См. также access().
QByteArray QMetaMethod::name() const
Возвращает имя этого метода.
Эта функция была добавлена в Qt 5.0.
См. также methodSignature() и parameterCount().
int QMetaMethod::parameterCount() const
Возвращает количество параметров этого метода.
Эта функция была добавлена в Qt 5.0.
См. также parameterType() и parameterNames().
QList<QByteArray> QMetaMethod::parameterNames() const
Возвращает список имен параметров.
См. также parameterTypes() и methodSignature().
int QMetaMethod::parameterType(int index) const
Возвращает тип параметра по заданному индексу.
Возвращаемое значение — один из типов, зарегистрированных в QMetaType, или QMetaType::UnknownType, если тип не зарегистрирован.
Эта функция была добавлена в Qt 5.0.
См. также parameterCount(), returnType() и QMetaType.
QList<QByteArray> QMetaMethod::parameterTypes() const
Возвращает список типов параметров.
См. также parameterNames() и methodSignature().
int QMetaMethod::returnType() const
Возвращает тип возвращаемого значения этого метода.
Возвращаемое значение — один из типов, зарегистрированных в QMetaType, или QMetaType::UnknownType, если тип не зарегистрирован.
Эта функция была добавлена в Qt 5.0.
См. также parameterType(), QMetaType и typeName().
int QMetaMethod::revision() const
Возвращает номер ревизии метода, если он был указан с помощью Q_REVISION, в противном случае возвращает 0.
Эта функция была добавлена в Qt 5.1.
const char *QMetaMethod::tag() const
Возвращает тег, связанный с этим методом.
Теги — это специальные макросы, распознаваемые moc , которые позволяют добавить дополнительную информацию о методе.
Информация о тегах может быть добавлена в объявлении функции следующим образом:
// 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(); и к информации можно получить доступ с помощью:
MainWindow win;
win.show();
int functionIndex = win.metaObject()->indexOfSlot("testFunc()");
QMetaMethod mm = win.metaObject()->method(functionIndex);
qDebug() << mm.tag(); // prints MY_CUSTOM_TAG На данный момент moc извлекает и записывает все теги, но не обрабатывает их специально. Вы можете использовать теги для аннотирования своих методов по-разному и обрабатывать их в соответствии с конкретными потребностями вашего приложения.
Примечание: начиная с Qt 5.0, moc расширяет препроцессорные макросы, поэтому необходимо окружать определение #ifndef Q_MOC_RUN, как показано в примере выше. В Qt 4 это не требовалось. Приведенный выше код также работает с Qt 4.
const char *QMetaMethod::typeName() const
Возвращает имя типа возвращаемого значения этого метода.
См. также returnType() и QMetaType::type().
Связанные нечленные функции
bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
Это перегруженная функция.
Возвращает true , если метод m1 не равен методу m2, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
bool operator==(const QMetaMethod &m1, const QMetaMethod &m2)
Это перегруженная функция.
Возвращает true , если метод m1 равен методу m2, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
Документация по макросам
Q_METAMETHOD_INVOKE_MAX_ARGS
Равно максимальному количеству аргументов, доступных для выполнения метода с помощью QMetaMethod::invoke()
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qmetamethod.html