Класс 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 | operator!=(const QMetaMethod &m1, const QMetaMethod &m2) |
| bool | operator==(const QMetaMethod &m1, const QMetaMethod &m2) |
Макросы
| Q_METAMETHOD_INVOKE_MAX_ARGS |
Подробное описание
QMetaMethod имеет типМетода(), подписьМетода(), список типовПараметров() и именПараметров(), имя возвращаемого типа(), тег() и спецификатор доступа(). Вы можете использовать вызвать() для вызова метода на произвольном QObject.
См. также QMetaObject, QMetaEnum, QMetaProperty и систему свойств Qt.
Документация по типам членов
Перечисление QMetaMethod::Доступ
Это перечисление описывает уровень доступа к методу, следуя соглашениям, используемым в C++.
| Константа | Значение |
|---|---|
QMetaMethod::Private |
0 |
QMetaMethod::Protected |
1 |
QMetaMethod::Public |
2 |
Перечисление QMetaMethod::ТипМетода
| Константа | Значение | Описание |
|---|---|---|
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.0/qmetamethod.html