QMetaObject Структура
Класс QMetaObject содержит метаданные об объектах Qt. Подробнее...
| Заголовок: | #include <QMetaObject> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Общественные типы
| класс | Подключение |
Общественные функции
| QMetaClassInfo | classInfo(int index) const |
| int | classInfoCount() const |
| int | classInfoOffset() const |
| const char * | className() const |
| QMetaMethod | constructor(int index) const |
| int | constructorCount() const |
| QMetaEnum | enumerator(int index) const |
| int | enumeratorCount() const |
| int | enumeratorOffset() const |
| int | indexOfClassInfo(const char *name) const |
| int | indexOfConstructor(const char *constructor) const |
| int | indexOfEnumerator(const char *name) const |
| int | indexOfMethod(const char *method) const |
| int | indexOfProperty(const char *name) const |
| int | indexOfSignal(const char *signal) const |
| int | indexOfSlot(const char *slot) const |
| bool | inherits(const QMetaObject *metaObject) const |
| QMetaMethod | method(int index) const |
| int | methodCount() const |
| int | methodOffset() const |
| QObject * | newInstance(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 |
| QMetaProperty | property(int index) const |
| int | propertyCount() const |
| int | propertyOffset() const |
| const QMetaObject * | superClass() const |
| QMetaProperty | userProperty() const |
Статические общественные члены
| bool | checkConnectArgs(const char *signal, const char *method) |
| bool | checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method) |
| void | connectSlotsByName(QObject *object) |
| bool | invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, 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()) |
| bool | invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, 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()) |
| bool | invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, 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()) |
| bool | invokeMethod(QObject *obj, const char *member, 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()) |
| bool | invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr) |
| bool | invokeMethod(QObject *context, Functor function, FunctorReturnType *ret) |
| QByteArray | normalizedSignature(const char *method) |
| QByteArray | normalizedType(const char *type) |
Макросы
| QGenericArgument | Q_ARG(Type, const Type &value) |
| QGenericReturnArgument | Q_RETURN_ARG(Type, Type &value) |
Подробное описание
Система метаобъектов Qt в Qt отвечает за механизм межобъектной связи с помощью сигналов и слотов, информацию о типе во время выполнения и систему свойств Qt. Один экземпляр QMetaObject создается для каждого подкласса QObject, используемого в приложении, и этот экземпляр хранит всю метаинформацию для подкласса QObject. Этот объект доступен как QObject::metaObject().
Этот класс обычно не требуется для программирования приложений, но он полезен, если вы пишете метаприложения, такие как движки сценариев или создатели графических интерфейсов.
Функции, которые вы, скорее всего, найдёте полезными, следующие:
- className() возвращает имя класса.
- superClass() возвращает метаобъект суперкласса.
- method() и methodCount() предоставляют информацию о метаметодах класса (сигналы, слоты и другие вызываемые члены-функции).
- enumerator() и enumeratorCount() предоставляют информацию об перечислениях класса.
- propertyCount() и property() предоставляют информацию о свойствах класса.
- constructor() и constructorCount() предоставляют информацию о метаконструкторах класса.
Функции индексирования indexOfConstructor(), indexOfMethod(), indexOfEnumerator() и indexOfProperty() сопоставляют имена конструкторов, членов-функций, перечислений или свойств с индексами в метаобъекте. Например, Qt использует indexOfMethod() в процессе внутренней работы, когда вы подключаете сигнал к слоту.
Классы также могут иметь список пар «имя—значение» дополнительной информации о классе, хранящейся в объектах QMetaClassInfo. Количество пар возвращает classInfoCount(), отдельные пары возвращаются функцией classInfo(), а вы можете искать пары с помощью indexOfClassInfo().
Примечание: Операции, использующие систему метаобъектов, обычно потокобезопасны, так как QMetaObjects обычно являются статическими, только для чтения, экземплярами, сгенерированными во время компиляции. Однако, если метаобъекты динамически изменяются приложением (например, при использовании QQmlPropertyMap), приложение должно явно синхронизировать доступ к соответствующему метаобъекту.
См. также QMetaClassInfo, QMetaEnum, QMetaMethod, QMetaProperty, QMetaType и Систему метаобъектов.
Документация по членам-функциям
[static] bool QMetaObject::checkConnectArgs(const char *signal, const char *method)
Возвращает true, если аргументы signal и method совместимы; в противном случае возвращает false.
Оба аргумента signal и method ожидаются в нормализованной форме.
См. также normalizedSignature().
[static, since 5.0] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
Это перегруженная функция.
Возвращает true, если аргументы signal и method совместимы; в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
QMetaClassInfo QMetaObject::classInfo(int index) const
Возвращает метаданные для элемента информации о классе с заданным index.
Пример:
class MyClass : public QObject
{
Q_OBJECT
Q_CLASSINFO("author", "Sabrina Schweinsteiger")
Q_CLASSINFO("url", "http://doc.moosesoft.co.uk/1.0/")
public:
...
}; См. также classInfoCount(), classInfoOffset() и indexOfClassInfo().
int QMetaObject::classInfoCount() const
Возвращает количество элементов информации о классе в этом классе.
См. также classInfo(), classInfoOffset() и indexOfClassInfo().
int QMetaObject::classInfoOffset() const
Возвращает смещение информации о классе для данного класса; т.е. позицию индекса первого элемента информации о классе этого класса.
Если у класса нет суперклассов с информацией о классе, смещение равно 0; в противном случае смещение равно сумме всех элементов информации о классе в суперклассах данного класса.
См. также classInfo(), classInfoCount() и indexOfClassInfo().
const char *QMetaObject::className() const
Возвращает имя класса.
См. также superClass().
[static] void QMetaObject::connectSlotsByName(QObject *object)
Рекурсивно ищет все дочерние объекты заданного object и подключает соответствующие сигналы от них к слотам object, которые следуют следующей форме:
void on_<object name>_<signal name>(<signal parameters>);
Предположим, что наш объект имеет дочерний объект типа QPushButton с именем объекта button1. Слотом для перехвата сигнала clicked() кнопки будет:
void on_button1_clicked();
Если у самого object корректно задано имя объекта, его собственные сигналы также подключаются к соответствующим слотам.
См. также QObject::setObjectName().
QMetaMethod QMetaObject::constructor(int index) const
Возвращает метаданные для конструктора с заданным index.
См. также constructorCount() и newInstance().
int QMetaObject::constructorCount() const
Возвращает количество конструкторов в этом классе.
См. также constructor() и indexOfConstructor().
QMetaEnum QMetaObject::enumerator(int index) const
Возвращает метаданные для перечисления с заданным index.
См. также enumeratorCount(), enumeratorOffset() и indexOfEnumerator().
int QMetaObject::enumeratorCount() const
Возвращает количество перечислений в этом классе.
См. также enumerator(), enumeratorOffset() и indexOfEnumerator().
int QMetaObject::enumeratorOffset() const
Возвращает смещение перечисления для данного класса; т.е. позицию индекса первого перечисления этого класса.
Если у класса нет суперклассов с перечислениями, смещение равно 0; в противном случае смещение равно сумме всех перечислений в суперклассах данного класса.
См. также enumerator(), enumeratorCount() и indexOfEnumerator().
int QMetaObject::indexOfClassInfo(const char *name) const
Находит элемент информации о классе по имени name и возвращает его индекс; в противном случае возвращает -1.
См. также classInfo(), classInfoCount() и classInfoOffset().
int QMetaObject::indexOfConstructor(const char *constructor) const
Находит constructor и возвращает его индекс; в противном случае возвращает -1.
Обратите внимание, что constructor должен быть в нормализованной форме, как возвращается функцией normalizedSignature().
См. также constructor(), constructorCount() и normalizedSignature().
int QMetaObject::indexOfEnumerator(const char *name) const
Находит перечисление по имени name и возвращает его индекс; в противном случае возвращает -1.
См. также enumerator(), enumeratorCount() и enumeratorOffset().
int QMetaObject::indexOfMethod(const char *method) const
Находит method и возвращает его индекс; в противном случае возвращает -1.
Обратите внимание, что method должен быть в нормализованной форме, как возвращается функцией normalizedSignature().
См. также method(), methodCount(), methodOffset() и normalizedSignature().
int QMetaObject::indexOfProperty(const char *name) const
Находит свойство по имени name и возвращает его индекс; в противном случае возвращает -1.
См. также property(), propertyCount(), и propertyOffset().
int QMetaObject::indexOfSignal(const char *signal) const
Находит signal и возвращает его индекс; в противном случае возвращает -1.
Это то же самое, что indexOfMethod(), за исключением того, что оно вернёт -1, если метод существует, но не является сигналом.
Обратите внимание, что signal должен быть в нормализованной форме, как возвращается normalizedSignature().
См. также indexOfMethod(), normalizedSignature(), method(), methodCount(), и methodOffset().
int QMetaObject::indexOfSlot(const char *slot) const
Находит slot и возвращает его индекс; в противном случае возвращает -1.
Это то же самое, что indexOfMethod(), за исключением того, что оно вернёт -1, если метод существует, но не является слотом.
См. также indexOfMethod(), method(), methodCount(), и methodOffset().
[since 5.7] bool QMetaObject::inherits(const QMetaObject *metaObject) const
Возвращает true если класс, описанный этим QMetaObject, наследует тип, описанный metaObject; в противном случае возвращает false.
Тип считается наследующим сам себя.
Эта функция была добавлена в Qt 5.7.
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, 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())
Вызывает member (имя сигнала или слота) для объекта obj. Возвращает true если член мог быть вызван. Возвращает false если такого члена нет или параметры не совпадают.
Вызов может быть синхронным или асинхронным, в зависимости от type:
- Если type равен Qt::DirectConnection, член вызывается немедленно.
- Если type равен Qt::QueuedConnection, будет отправлен QEvent, и член вызывается, как только приложение войдёт в главный цикл обработки событий.
- Если type равен Qt::BlockingQueuedConnection, метод вызывается так же, как и для Qt::QueuedConnection, за исключением того, что текущая нить заблокируется, пока событие не будет доставлено. Использование этого типа соединения для взаимодействия между объектами в одной и той же нити приведёт к тупику.
- Если type равен Qt::AutoConnection, член вызывается синхронно, если obj находится в той же нити, что и вызывающий; в противном случае он вызовет член асинхронно.
Значение возвращаемое функцией member помещается в ret. Если вызов является асинхронным, значение возврата не может быть вычислено. Вы можете передать до десяти аргументов (val0, val1, val2, val3, val4, val5, val6, val7, val8 и val9) в функцию member.
QGenericArgument и QGenericReturnArgument — это внутренние вспомогательные классы. Поскольку сигналы и слоты могут вызываться динамически, вы должны заключать аргументы в макросы Q_ARG() и Q_RETURN_ARG(). Q_ARG() принимает имя типа и константную ссылку на этот тип; Q_RETURN_ARG() принимает имя типа и неконстантную ссылку.
Вам нужно только передать имя сигнала или слота в эту функцию, а не всю сигнатуру. Например, чтобы асинхронно вызвать слот quit() в QThread, используйте следующий код:
QMetaObject::invokeMethod(thread, "quit",
Qt::QueuedConnection); При асинхронных вызовах методов параметры должны быть типов, которые известны системе метаобъектов Qt, потому что Qt нужно скопировать аргументы для их хранения в событии за кулисами. Если вы попытаетесь использовать очередимое соединение и получите сообщение об ошибке
QMetaObject::invokeMethod: Unable to handle unregistered datatype 'MyType'
вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных перед вызовом invokeMethod().
Чтобы синхронно вызвать слот compute(QString, int, double) на произвольном объекте obj получить его возвращаемое значение:
QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
Q_RETURN_ARG(QString, retVal),
Q_ARG(QString, "sqrt"),
Q_ARG(int, 42),
Q_ARG(double, 9.7)); Если слот "compute" не принимает ровно один QString, один int и один double в указанном порядке, вызов завершится ошибкой.
Примечание: Эта функция является безопасной для потоков.
См. также Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), и QMetaMethod::invoke().
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, 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())
Эта функция перегружает invokeMethod().
Этот перегруз всегда вызывает член с типом соединения Qt::AutoConnection.
Примечание: Эта функция является безопасной для потоков.
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, 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())
Эта функция перегружает invokeMethod().
Этот перегруз может быть использован, если значение возврата члена не представляет интереса.
Примечание: Эта функция является безопасной для потоков.
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, 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())
Эта функция перегружает invokeMethod().
Эта перегрузка вызывает член, используя тип соединения Qt::AutoConnection, и игнорирует возвращаемые значения.
Примечание: Эта функция является потокобезопасной.
[static, since 5.10] template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)
Это перегруженная функция.
Вызывает function в цикле событий context. function может быть функтором или указателем на член-функцию. Возвращает true если функция была вызвана. Возвращает false если такой функции нет или параметры не совпадают. Возвращаемое значение вызова функции помещается в ret.
Примечание: Эта функция является потокобезопасной.
Эта функция была представлена в Qt 5.10.
[static, since 5.10] template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, FunctorReturnType *ret)
Это перегруженная функция.
Вызывает function в цикле событий context, используя тип соединения Qt::AutoConnection. function может быть функтором или указателем на член-функцию. Возвращает true если функция была вызвана. Возвращает false если такого члена нет или параметры не совпадают. Возвращаемое значение вызова функции помещается в ret.
Примечание: Эта функция является потокобезопасной.
Эта функция была представлена в Qt 5.10.
QMetaMethod QMetaObject::method(int index) const
Возвращает метаданные для метода с заданным index.
См. также methodCount(), methodOffset() и indexOfMethod().
int QMetaObject::methodCount() const
Возвращает количество методов в этом классе, включая количество методов, предоставленных каждым базовым классом. Они включают сигналы, слоты и обычные член-функции.
Для получения списка методов, специфичных для данного класса, используйте код, подобный следующему:
const QMetaObject* metaObject = obj->metaObject();
QStringList methods;
for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
methods << QString::fromLatin1(metaObject->method(i).methodSignature()); См. также method(), methodOffset() и indexOfMethod().
int QMetaObject::methodOffset() const
Возвращает смещение метода для этого класса; т.е. позицию индекса первой член-функции этого класса.
Смещение является суммой всех методов в родительских классах (что всегда положительно, так как у QObject есть слот deleteLater() и сигнал destroyed()).
См. также method(), methodCount() и indexOfMethod().
QObject *QMetaObject::newInstance(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
Создает новый экземпляр этого класса. Вы можете передать до десяти аргументов (val0, val1, val2, val3, val4, val5, val6, val7, val8 и val9) в конструктор. Возвращает новый объект или nullptr если подходящий конструктор недоступен.
Обратите внимание, что только конструкторы, объявленные с модификатором Q_INVOKABLE, доступны через систему метаобъектов.
См. также Q_ARG() и constructor().
[static] QByteArray QMetaObject::normalizedSignature(const char *method)
Нормализует сигнатуру заданного метода method.
Qt использует нормализованные сигнатуры, чтобы определить, совместимы ли два заданных сигнала и слоты. Нормализация сводит пробелы к минимуму, перемещает 'const' вперед, где это уместно, удаляет 'const' из типов значений и заменяет ссылки const на значения.
См. также checkConnectArgs() и normalizedType().
[static] QByteArray QMetaObject::normalizedType(const char *type)
Нормализует type.
См. QMetaObject::normalizedSignature() для описания того, как Qt выполняет нормализацию.
Пример:
QByteArray normType = QMetaObject::normalizedType(" int const *");
// normType is now "const int*" См. также normalizedSignature().
QMetaProperty QMetaObject::property(int index) const
Возвращает метаданные для свойства с заданным index. Если такого свойства нет, возвращается null QMetaProperty.
См. также propertyCount(), propertyOffset() и indexOfProperty().
int QMetaObject::propertyCount() const
Возвращает количество свойств в этом классе, включая количество свойств, предоставленных каждым базовым классом.
Для получения списка свойств, специфичных для данного класса, используйте код, подобный следующему:
const QMetaObject* metaObject = obj->metaObject();
QStringList properties;
for(int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i)
properties << QString::fromLatin1(metaObject->property(i).name()); См. также property(), propertyOffset() и indexOfProperty().
int QMetaObject::propertyOffset() const
Возвращает смещение свойства для этого класса; т.е. позицию индекса первого свойства этого класса.
Смещение является суммой всех свойств в родительских классах (что всегда положительно, так как у QObject есть свойство name()).
См. также property(), propertyCount() и indexOfProperty().
const QMetaObject *QMetaObject::superClass() const
Возвращает метаобъект суперкласса или nullptr если такого объекта нет.
См. также className().
QMetaProperty QMetaObject::userProperty() const
Возвращает свойство, у которого флаг USER установлен в true.
См. также QMetaProperty::isUser().
Документация макросов
QGenericArgument Q_ARG(Type, const Type &value)
Этот макрос принимает Type и value этого типа и возвращает объект QGenericArgument, который можно передать в QMetaObject::invokeMethod().
См. также Q_RETURN_ARG().
QGenericReturnArgument Q_RETURN_ARG(Type, Type &value)
Этот макрос принимает Type и неконстантную ссылку на value этого типа и возвращает объект QGenericReturnArgument, который можно передать в QMetaObject::invokeMethod().
См. также Q_ARG().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qmetaobject.html