Класс 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 |
Статические public члены
| QMetaMethod | fromSignal(PointerToMemberFunction signal) |
Связанные non-члены
| 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.
Документация по типу члена
Перечисление 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] 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, одно целое число и одно double в указанном порядке, вызов завершится неудачей.
Предупреждение: этот метод не будет проверять корректность аргументов: 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
Возвращает тип параметра по заданному index.
Возвращаемое значение — один из типов, зарегистрированных в 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/archives/qt-5.11/qmetamethod.html