Класс QMetaMethod
Класс QMetaMethod предоставляет метаданные о методе члена. Подробнее...
| Заголовок: | #include <QMetaMethod> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Типы public
| перечисление | Доступ { Закрытый, Защищенный, Открытый } |
| перечисление | ТипМетода { Метод, Сигнал, Слоты, Конструктор } |
Функции public
| 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 |
| bool | являетсяВалидным() const |
| int | индексМетода() const |
| QByteArray | подписьМетода() const |
| QMetaMethod::ТипМетода | типМетода() const |
| QByteArray | имя() const |
| int | количествоПараметров() const |
| QMetaType | типПараметраMetaType(int индекс) const |
| QList<QByteArray> | именаПараметров() const |
| int | типПараметра(int индекс) const |
| QByteArray | имяТипПараметра(int индекс) const |
| QList<QByteArray> | типыПараметров() const |
| int | относительныйИндексМетода() const |
| QMetaType | типВозвращаемогоЗначенияMetaType() const |
| int | типВозвращаемогоЗначения() const |
| int | ревизия() const |
| const char * | тег() const |
| const char * | имяТип() const |
Статические public члены
| QMetaMethod | изСигнала(PointerToMemberFunction сигнал) |
Связанные нечлены
| bool | operator!=(const QMetaMethod &m1, const QMetaMethod &m2) |
| bool | operator==(const QMetaMethod &m1, const QMetaMethod &m2) |
Макросы
| Q_METAMETHOD_ВЫЗОВ_МАКС_АРГУМЕНТОВ |
Подробное описание
QMetaMethod имеет типМетода(), подписьМетода(), список типовПараметров() и именПараметров(), тип возвращаемого значения имяТип(), тег() и спецификатор доступа доступ(). Вы можете использовать вызвать() для вызова метода на произвольном QObject.
См. также QMetaObject, QMetaEnum, QMetaProperty и Систему свойств Qt.
Документация по типам членов
перечисление QMetaMethod::Доступ
Это перечисление описывает уровень доступа к методу, следуя соглашениям, используемым в 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).
Примечание: Сигналы всегда являются публичными, но это следует рассматривать как реализационную деталь. Почти всегда плохой идеей является отправка сигнала извне своего класса.
См. также 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'
перед вызовом QMetaMethod::invoke() необходимо зарегистрировать тип данных с помощью qRegisterMetaType().
Для синхронного вызова слота 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 6.2] bool QMetaMethod::isConst() const
Возвращает значение, указывающее, является ли метод const.
Примечание: Этот метод может ошибочно вернуть false для const-метода, если он принадлежит библиотеке, скомпилированной с более старой версией Qt.
Функция была введена в Qt 6.2.
[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.2/qmetamethod.html