Класс QMetaMethod
Класс QMetaMethod предоставляет метаданные о членской функции. Подробнее...
| Заголовок: | #include <QMetaMethod> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Открытые типы
| Перечисление | Доступ { Четный, Защищенный, Общедоступный } |
| Перечисление | Тип метода { Метод, Сигнал, Слот, Конструктор } |
Открытые функции
| QMetaMethod::Доступ | доступ() const |
| bool | вызвать(QObject *объект, Qt::ConnectionType типСвязи, QGenericReturnArgument возвращаемоеЗначение, QGenericArgument значение0 = QGenericArgument(nullptr), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | вызвать(QObject *объект, QGenericReturnArgument возвращаемоеЗначение, QGenericArgument значение0 = QGenericArgument(0), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | вызвать(QObject *объект, Qt::ConnectionType типСвязи, QGenericArgument значение0 = QGenericArgument(0), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | вызвать(QObject *объект, QGenericArgument значение0 = QGenericArgument(0), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | вызватьНаГаджет(void *гаджет, QGenericReturnArgument возвращаемоеЗначение, QGenericArgument значение0 = QGenericArgument(nullptr), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | вызватьНаГаджет(void *гаджет, QGenericArgument значение0 = QGenericArgument(0), QGenericArgument значение1 = QGenericArgument(), QGenericArgument значение2 = QGenericArgument(), QGenericArgument значение3 = QGenericArgument(), QGenericArgument значение4 = QGenericArgument(), QGenericArgument значение5 = QGenericArgument(), QGenericArgument значение6 = QGenericArgument(), QGenericArgument значение7 = QGenericArgument(), QGenericArgument значение8 = QGenericArgument(), QGenericArgument значение9 = QGenericArgument()) const |
| bool | действителен() const |
| int | индексМетода() const |
| QByteArray | подписьМетода() const |
| QMetaMethod::ТипМетода | типМетода() const |
| QByteArray | имя() const |
| int | количествоПараметров() const |
| QMetaType | типПараметра(int индекс) const |
| QList<QByteArray> | именаПараметров() const |
| int | типПараметра(int индекс) const |
| QByteArray | имяТипаПараметра(int индекс) const |
| QList<QByteArray> | типыПараметров() const |
| int | относительныйИндексМетода() const |
| QMetaType | типВозвращаемогоЗначения() const |
| int | типВозвращаемогоЗначения() const |
| int | ревизия() const |
| const char * | тег() const |
| const char * | имяТипа() const |
Статические открытые члены
| QMetaMethod | изСигнала(PointerToMemberFunction сигнал) |
Связанные нечлены
| bool | оператор!=(const QMetaMethod &m1, const QMetaMethod &m2) |
| bool | оператор==(const QMetaMethod &m1, const QMetaMethod &m2) |
Макросы
| Q_METAMETHOD_INVOKE_MAX_ARGS |
Подробное описание
У QMetaMethod есть тип метода, подпись метода, список типов параметров и названий параметров, возвращаемый тип, тег и спецификатор доступа. Вы можете использовать invoke для вызова метода на произвольном QObject.
См. также QMetaObject, QMetaEnum, QMetaProperty и Систему свойств Qt.
Документация по типам членов
перечисление QMetaMethod::Access
Это перечисление описывает уровень доступа к методу, следуя соглашениям, используемым в C++.
| Постоянная | Значение |
|---|---|
QMetaMethod::Private |
0 |
QMetaMethod::Protected |
1 |
QMetaMethod::Public |
2 |
перечисление 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, since 5.0] template <typename PointerToMemberFunction> 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() принимает имя типа и неконстантную ссылку.
Для асинхронного вызова слота 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(0), 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
Эта функция перегружает invoke().
Эта перегрузка всегда вызывает этот метод с помощью типа подключения Qt::AutoConnection.
bool QMetaMethod::invoke(QObject *object, Qt::ConnectionType connectionType, QGenericArgument val0 = QGenericArgument(0), 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
Эта функция перегружает invoke().
Эта перегрузка может использоваться, если значение возврата члена не представляет интереса.
bool QMetaMethod::invoke(QObject *object, QGenericArgument val0 = QGenericArgument(0), 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
Эта функция перегружает invoke().
Эта перегрузка вызывает этот метод с типом подключения Qt::AutoConnection и игнорирует значения возврата.
[since 5.5] 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().
[since 5.5] bool QMetaMethod::invokeOnGadget(void *gadget, QGenericArgument val0 = QGenericArgument(0), 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
Это перегруженная функция.
Эта перегрузка вызывает этот метод для gadget и игнорирует возвращаемые значения.
Данная функция была введена в Qt 5.5.
[since 5.0] bool QMetaMethod::isValid() const
Возвращает true если этот метод является валидным (может быть проинспектирован и вызван), в противном случае возвращает false.
Данная функция была введена в Qt 5.0.
int QMetaMethod::methodIndex() const
Возвращает индекс этого метода.
[since 5.0] QByteArray QMetaMethod::methodSignature() const
Возвращает сигнатуру этого метода (например, setValue(double)).
Данная функция была введена в Qt 5.0.
См. также parameterTypes() и parameterNames().
QMetaMethod::MethodType QMetaMethod::methodType() const
Возвращает тип этого метода (сигнал, слот или метод).
См. также access().
[since 5.0] QByteArray QMetaMethod::name() const
Возвращает имя этого метода.
Данная функция была введена в Qt 5.0.
См. также methodSignature() и parameterCount().
[since 5.0] int QMetaMethod::parameterCount() const
Возвращает количество параметров этого метода.
Данная функция была введена в Qt 5.0.
См. также parameterType() и parameterNames().
[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const
Возвращает метатип параметра по заданному index.
Если index меньше нуля или больше parameterCount(), возвращается невалидный QMetaType.
Данная функция была введена в Qt 6.0.
См. также parameterCount(), returnMetaType(), и QMetaType.
QList<QByteArray> QMetaMethod::parameterNames() const
Возвращает список имён параметров.
См. также parameterTypes() и methodSignature().
[since 5.0] int QMetaMethod::parameterType(int index) const
Возвращает тип параметра по заданному index.
Возвращаемое значение — один из типов, зарегистрированных в QMetaType, или QMetaType::UnknownType, если тип не зарегистрирован.
Данная функция была введена в Qt 5.0.
См. также parameterCount(), parameterMetaType(), returnType(), и QMetaType.
[since 6.0] QByteArray QMetaMethod::parameterTypeName(int index) const
Возвращает имя типа по позиции index. Если параметра по index нет, возвращает пустую QByteArray
Данная функция была введена в Qt 6.0.
См. также parameterNames().
QList<QByteArray> QMetaMethod::parameterTypes() const
Возвращает список типов параметров.
См. также parameterNames() и methodSignature().
[since 6.0] int QMetaMethod::relativeMethodIndex() const
Возвращает локальный индекс этого метода внутри.
Данная функция была введена в Qt 6.0.
[since 6.0] QMetaType QMetaMethod::returnMetaType() const
Возвращает тип возвращаемого значения этого метода.
Данная функция была введена в Qt 6.0.
См. также parameterMetaType(), QMetaType, и typeName().
[since 5.0] int QMetaMethod::returnType() const
Возвращает тип возвращаемого значения этого метода.
Возвращаемое значение — один из типов, зарегистрированных в QMetaType, или QMetaType::UnknownType, если тип не зарегистрирован.
Данная функция была введена в Qt 5.0.
См. также parameterType(), QMetaType, typeName(), и returnMetaType().
[since 5.1] 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().
Связанные нечлены
[since 5.0] bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
Это перегруженная функция.
Возвращает true если метод m1 не равен методу m2, в противном случае возвращает false.
Эта функция была введена в Qt 5.0.
[since 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-6.1/qmetamethod.html