Класс QMetaMethod
Класс QMetaMethod предоставляет метаданные о член-функции. Подробнее...
| Заголовок: | #include <QMetaMethod> |
| 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 |
| QList<QByteArray> | именаПараметров() const |
| int | типПараметра(int индекс) const |
| QList<QByteArray> | типыПараметров() 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 есть 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] 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 и игнорирует значения возврата.
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(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.
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.15/qmetamethod.html