Структура QMetaObject
Класс QMetaObject содержит метаданные о Qt-объектах. Подробнее...
| Заголовок: | #include <QMetaObject> |
| qmake: | QT += core |
Открытые типы
| класс | Подключение |
Открытые функции
| QMetaClassInfo | classInfo(int index) const |
| int | количество_информации_о_классе() const |
| int | смещение_информации_о_классе() const |
| const char * | имя_класса() const |
| QMetaMethod | конструктор(int index) const |
| int | количество_конструкторов() const |
| QMetaEnum | перечислитель(int index) const |
| int | количество_перечислителей() const |
| int | смещение_перечислителя() const |
| int | индекс_информации_о_классе(const char *name) const |
| int | индекс_конструктора(const char *constructor) const |
| int | индекс_перечислителя(const char *name) const |
| int | индекс_метода(const char *method) const |
| int | индекс_свойства(const char *name) const |
| int | индекс_сигнала(const char *signal) const |
| int | индекс_слота(const char *slot) const |
| bool | наследует(const QMetaObject *metaObject) const |
| QMetaMethod | метод(int index) const |
| int | количество_методов() const |
| int | смещение_метода() const |
| QObject * | создать_экземпляр(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 | свойство(int index) const |
| int | количество_свойств() const |
| int | смещение_свойства() const |
| const QMetaObject * | предок() const |
| QMetaProperty | пользовательское_свойство() const |
Статические открытые члены
| bool | проверить_аргументы_соединения(const char *signal, const char *method) |
| bool | проверить_аргументы_соединения(const QMetaMethod &signal, const QMetaMethod &method) |
| void | соединить_слоты_по_имени(QObject *object) |
| bool | вызвать_метод(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()) |
| QByteArray | нормализованная_подпись(const char *method) |
| QByteArray | нормализованный_тип(const char *type) |
Макросы
| QGenericArgument | Q_АРГУМЕНТ(Type, const Type &value) |
| QGenericReturnArgument | Q_АРГУМЕНТ_ВОЗВРАТА(Type, Type &value) |
Подробное описание
Система метаобъектов Qt отвечает за межобъектное взаимодействие с помощью сигналов и слотов, динамическую информацию о типах и систему свойств Qt. Для каждого подкласса QObject в приложении создается экземпляр QMetaObject, который хранит всю метаинформацию для данного подкласса 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] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
Это перегруженная функция.
Возвращает true если аргументы signal и method совместимы; в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
QMetaClassInfo QMetaObject::classInfo(int index) const
Возвращает метаданные для элемента информации о классе с заданным индексом.
Пример:
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
Возвращает метаданные для конструктора с заданным индексом.
Эта функция была добавлена в Qt 4.5.
См. также constructorCount() и newInstance().
int QMetaObject::constructorCount() const
Возвращает количество конструкторов в этом классе.
Эта функция была добавлена в Qt 4.5.
См. также constructor() и indexOfConstructor().
QMetaEnum QMetaObject::enumerator(int index) const
Возвращает метаданные для перечисления с заданным индексом.
См. также 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().
Эта функция была добавлена в Qt 4.5.
См. также 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
Находит сигнал и возвращает его индекс; в противном случае возвращает -1.
Это то же самое, что indexOfMethod(), за исключением того, что оно вернёт -1, если метод существует, но не является сигналом.
Обратите внимание, что сигнал должен быть в нормализованной форме, как возвращается normalizedSignature().
См. также indexOfMethod(), normalizedSignature(), method(), methodCount() и methodOffset().
int QMetaObject::indexOfSlot(const char *slot) const
Находит слот и возвращает его индекс; в противном случае возвращает -1.
Это то же самое, что indexOfMethod(), за исключением того, что оно вернёт -1, если метод существует, но не является слотом.
См. также indexOfMethod(), method(), methodCount() и methodOffset().
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, одно целое число и одно число с плавающей точкой в указанном порядке, вызов завершится неудачей.
Примечание: Эта функция безопасна для многопоточных приложений.
См. также Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType() и QMetaMethod::invoke().
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...)
Эта функция перегружает invokeMethod().
Этот перегруз всегда вызывает член с типом соединения Qt::AutoConnection.
Примечание: Эта функция безопасна для многопоточных приложений.
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...)
Эта функция перегружает invokeMethod().
Этот перегруз может быть использован, если возвращаемое значение члена не представляет интереса.
Примечание: Эта функция безопасна для многопоточных приложений.
[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, QGenericArgument val0 = ..., QGenericArgument val1 = ..., QGenericArgument val2 = ..., QGenericArgument val3 = ..., QGenericArgument val4 = ..., QGenericArgument val5 = ..., QGenericArgument val6 = ..., QGenericArgument val7 = ..., QGenericArgument val8 = ..., QGenericArgument val9 = ...)
Эта функция перегружает invokeMethod().
Этот перегруз вызывает член с типом соединения Qt::AutoConnection и игнорирует возвращаемые значения.
Примечание: Эта функция безопасна для многопоточных приложений.
[static] 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] 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
Возвращает количество методов в этом классе, включая количество методов, предоставленных каждым базовым классом. Это включает сигналы, слоты и обычные члены-функции.
Используйте код, подобный следующему, чтобы получить QStringList, содержащий методы, специфичные для данного класса:
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, доступны через систему метаобъектов.
Эта функция была добавлена в Qt 4.5.
См. также 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*" Эта функция была добавлена в Qt 4.2.
См. также normalizedSignature().
QMetaProperty QMetaObject::property(int index) const
Возвращает метаданные для свойства с заданным index. Если такое свойство не существует, возвращается нулевое значение QMetaProperty.
См. также propertyCount(), propertyOffset() и indexOfProperty().
int QMetaObject::propertyCount() const
Возвращает количество свойств в этом классе, включая количество свойств, предоставленных каждым базовым классом.
Используйте код, подобный следующему, чтобы получить QStringList, содержащий свойства, специфичные для данного класса:
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.
Эта функция была добавлена в Qt 4.2.
См. также 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-5.14/qmetaobject.html