Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются безопасными для многопоточности.
Публичные типы
| Перечисление | Type { Void, Bool, Int, UInt, ..., UnknownType } |
| Перечисление | TypeFlag { NeedsConstruction, NeedsDestruction, MovableType, IsEnumeration, PointerToQObject } |
| Флаги | TypeFlags |
Публичные функции
| QMetaType(const int typeId) | |
| ~QMetaType() | |
| void * | construct(void *where, const void *copy = ...) const |
| void * | create(const void *copy = ...) const |
| void | destroy(void *data) const |
| void | destruct(void *data) const |
| QMetaType::TypeFlags | flags() const |
| bool | isRegistered() const |
| bool | isValid() const |
| const QMetaObject * | metaObject() const |
| int | sizeOf() const |
Статические публичные члены
| bool | compare(const void *lhs, const void *rhs, int typeId, int *result) |
| void * | construct(int type, void *where, const void *copy) |
| bool | convert(const void *from, int fromTypeId, void *to, int toTypeId) |
| void * | create(int type, const void *copy = nullptr) |
| bool | debugStream(QDebug &dbg, const void *rhs, int typeId) |
| void | destroy(int type, void *data) |
| void | destruct(int type, void *where) |
| bool | equals(const void *lhs, const void *rhs, int typeId, int *result) |
| bool | hasRegisteredComparators() |
| bool | hasRegisteredComparators(int typeId) |
| bool | hasRegisteredConverterFunction(int fromTypeId, int toTypeId) |
| bool | hasRegisteredConverterFunction() |
| bool | hasRegisteredDebugStreamOperator() |
| bool | hasRegisteredDebugStreamOperator(int typeId) |
| bool | isRegistered(int type) |
| bool | load(QDataStream &stream, int type, void *data) |
| const QMetaObject * | metaObjectForType(int type) |
| bool | registerComparators() |
| bool | registerConverter() |
| bool | registerConverter(MemberFunction function) |
| bool | registerConverter(MemberFunctionOk function) |
| bool | registerConverter(UnaryFunction function) |
| bool | registerDebugStreamOperator() |
| bool | registerEqualsComparator() |
| bool | save(QDataStream &stream, int type, const void *data) |
| int | sizeOf(int type) |
| int | type(const char *typeName) |
| int | type(const ::QByteArray &typeName) |
| QMetaType::TypeFlags | typeFlags(int type) |
| const char * | typeName(int typeId) |
Связанные нечлены
| int | qMetaTypeId() |
| int | qRegisterMetaType(const char *typeName) |
| int | qRegisterMetaType() |
| void | qRegisterMetaTypeStreamOperators(const char *typeName) |
Макросы
| Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container) | |
| Q_DECLARE_METATYPE(Type) | |
| Q_DECLARE_OPAQUE_POINTER(PointerType) | |
| Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container) | |
| Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer) |
Подробное описание
Класс QMetaType управляет именованными типами в системе метаобъектов.
Класс используется в качестве помощника для маршалинга типов в QVariant и при подключении к очереди сигналов и слотов. Он сопоставляет имя типа с типом, чтобы его можно было создавать и уничтожать динамически во время выполнения. Объявляйте новые типы с помощью Q_DECLARE_METATYPE(), чтобы сделать их доступными для QVariant и других функций на основе шаблонов. Вызывайте qRegisterMetaType(), чтобы сделать типы доступными для функций, не основанных на шаблонах, таких как подключение сигналов и слотов к очереди.
Любой класс или структура, имеющие публичный конструктор по умолчанию, публичный конструктор копирования и публичный деструктор, может быть зарегистрирован.
Следующий код выделяет и уничтожает экземпляр MyClass:
int id = QMetaType::type("MyClass");
if (id != QMetaType::UnknownType) {
void *myClassPtr = QMetaType::create(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
} Если мы хотим, чтобы операторы потоков operator<<() и operator>>() работали с объектами QVariant, хранящими пользовательские типы, пользовательский тип должен предоставлять операторы operator<<() и operator>>().
См. также Q_DECLARE_METATYPE(), QVariant::setValue(), QVariant::value() и QVariant::fromValue().
Документация по типам членов
перечисление QMetaType::Type
Это встроенные типы, поддерживаемые QMetaType:
| Константа | Значение | Описание |
|---|---|---|
QMetaType::Void |
43 |
void |
QMetaType::Bool |
1 |
bool |
QMetaType::Int |
2 |
int |
QMetaType::UInt |
3 |
unsigned int |
QMetaType::Double |
6 |
double |
QMetaType::QChar |
7 |
QChar |
QMetaType::QString |
10 |
QString |
QMetaType::QByteArray |
12 |
QByteArray |
QMetaType::Nullptr |
51 |
std::nullptr_t |
QMetaType::VoidStar |
31 |
void * |
QMetaType::Long |
32 |
long |
QMetaType::LongLong |
4 |
LongLong |
QMetaType::Short |
33 |
short |
QMetaType::Char |
34 |
char |
QMetaType::ULong |
35 |
unsigned long |
QMetaType::ULongLong |
5 |
ULongLong |
QMetaType::UShort |
36 |
unsigned short |
QMetaType::SChar |
40 |
signed char |
QMetaType::UChar |
37 |
unsigned char |
QMetaType::Float |
38 |
float |
QMetaType::QObjectStar |
39 |
QObject * |
QMetaType::QVariant |
41 |
QVariant |
QMetaType::QCursor |
74 |
QCursor |
QMetaType::QDate |
14 |
QDate |
QMetaType::QSize |
21 |
QSize |
QMetaType::QTime |
15 |
QTime |
QMetaType::QVariantList |
9 |
QVariantList |
QMetaType::QPolygon |
71 |
QPolygon |
QMetaType::QPolygonF |
86 |
QPolygonF |
QMetaType::QColor |
67 |
QColor |
QMetaType::QSizeF |
22 |
QSizeF |
QMetaType::QRectF |
20 |
QRectF |
QMetaType::QLine |
23 |
QLine |
QMetaType::QTextLength |
77 |
QTextLength |
QMetaType::QStringList |
11 |
QStringList |
QMetaType::QVariantMap |
8 |
QVariantMap |
QMetaType::QVariantHash |
28 |
QVariantHash |
QMetaType::QIcon |
69 |
QIcon |
QMetaType::QPen |
76 |
QPen |
QMetaType::QLineF |
24 |
QLineF |
QMetaType::QTextFormat |
78 |
QTextFormat |
QMetaType::QRect |
19 |
QRect |
QMetaType::QPoint |
25 |
QPoint |
QMetaType::QUrl |
17 |
QUrl |
QMetaType::QRegExp |
27 |
QRegExp |
QMetaType::QRegularExpression |
44 |
QRegularExpression |
QMetaType::QDateTime |
16 |
QDateTime |
QMetaType::QPointF |
26 |
QPointF |
QMetaType::QPalette |
68 |
QPalette |
QMetaType::QFont |
64 |
QFont |
QMetaType::QBrush |
66 |
QBrush |
QMetaType::QRegion |
72 |
QRegion |
QMetaType::QBitArray |
13 |
QBitArray |
QMetaType::QImage |
70 |
QImage |
QMetaType::QKeySequence |
75 |
QKeySequence |
QMetaType::QSizePolicy |
121 |
QSizePolicy |
QMetaType::QPixmap |
65 |
QPixmap |
QMetaType::QLocale |
18 |
QLocale |
QMetaType::QBitmap |
73 |
QBitmap |
QMetaType::QMatrix |
79 |
QMatrix |
QMetaType::QTransform |
80 |
QTransform |
QMetaType::QMatrix4x4 |
81 |
QMatrix4x4 |
QMetaType::QVector2D |
82 |
QVector2D |
QMetaType::QVector3D |
83 |
QVector3D |
QMetaType::QVector4D |
84 |
QVector4D |
QMetaType::QQuaternion |
85 |
QQuaternion |
QMetaType::QEasingCurve |
29 |
QEasingCurve |
QMetaType::QJsonValue |
45 |
QJsonValue |
QMetaType::QJsonObject |
46 |
QJsonObject |
QMetaType::QJsonArray |
47 |
QJsonArray |
QMetaType::QJsonDocument |
48 |
QJsonDocument |
QMetaType::QModelIndex |
42 |
QModelIndex |
QMetaType::QPersistentModelIndex |
50 |
QPersistentModelIndex (с 5.5) |
QMetaType::QUuid |
30 |
QUuid |
QMetaType::QByteArrayList |
49 |
QByteArrayList |
QMetaType::User |
1024 |
Базовое значение для пользовательских типов |
QMetaType::UnknownType |
0 |
Это неверный идентификатор типа. Он возвращается из QMetaType для типов, которые не зарегистрированы |
Дополнительные типы можно зарегистрировать, используя Q_DECLARE_METATYPE().
См. также type() и typeName().
enum QMetaType::TypeFlagflags QMetaType::TypeFlags
Перечисление описывает атрибуты типа, поддерживаемые QMetaType.
| Константа | Значение | Описание |
|---|---|---|
QMetaType::NeedsConstruction |
0x1 |
У этого типа есть конструкторы с нетривиальным поведением. Если флаг не установлен, экземпляры можно безопасно инициализировать с помощью memset в 0. |
QMetaType::NeedsDestruction |
0x2 |
У этого типа есть деструктор с нетривиальным поведением. Если флаг не установлен, вызовы деструктора не нужны перед удалением объектов. |
QMetaType::MovableType |
0x4 |
Экземпляр типа, имеющего этот атрибут, можно безопасно перемещать с помощью memcpy. |
QMetaType::IsEnumeration |
0x10 |
Этот тип является перечислением |
QMetaType::PointerToQObject |
0x8 |
Этот тип является указателем на производный от QObject. Этот тип является Q_GADGET, и соответствующий QMetaObject может быть доступен с помощью QMetaType::metaObject. С 5.5. |
Тип TypeFlags является псевдонимом для QFlags<TypeFlag>. Он хранит логическое ИЛИ сочетание значений TypeFlag.
Документация по функциям-членам
QMetaType::QMetaType(const int typeId)
Создает объект QMetaType, который содержит всю информацию о типе typeId.
Эта функция была добавлена в Qt 5.0.
QMetaType::~QMetaType()
Удаляет этот объект.
bool QMetaType::compare(const void *lhs, const void *rhs, int typeId, int *result)
Сравнивает объекты по адресам lhs и rhs. Оба объекта должны быть типа typeId. result устанавливается меньше, равно или больше нуля, если lhs меньше, равно или больше rhs. Возвращает true, если сравнение выполнено успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
void *QMetaType::construct(int type, void *where, const void *copy)
Создаёт значение заданного типа type в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите вызов create(), если вам не нужен этот уровень контроля (то есть, используйте "new" вместо "placement new").
Вы должны убедиться, что where указывает на место, которое может хранить значение типа type, и что where правильно выровнен. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается к своему естественному границе, которая является наименьшей степенью двойки, большей чем тип, если это выравнивание не больше максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 2 * sizeof(void*) необходимо только для специальных инструкций аппаратного обеспечения (например, выровненных загрузок и сохранений SSE на x86).
Эта функция была добавлена в Qt 5.0.
См. также destruct() и sizeOf().
void *QMetaType::construct(void *where, const void *copy = ...) const
Создаёт значение типа, для которого был создан этот экземпляр QMetaType, в существующей памяти по адресу where, которое является копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите вызов create(), если вам не нужен этот уровень контроля (то есть, используйте "new" вместо "placement new").
Вы должны убедиться, что where указывает на место, где может храниться новое значение, и что where правильно выровнен. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается к своему естественному границе, которая является наименьшей степенью двойки, большей чем тип, если это выравнивание не больше максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 2 * sizeof(void*) необходимо только для специальных инструкций аппаратного обеспечения (например, выровненных загрузок и сохранений SSE на x86).
Эта функция была добавлена в Qt 5.0.
bool QMetaType::convert(const void *from, int fromTypeId, void *to, int toTypeId)
Преобразует объект в адресе from из типа fromTypeId в предварительно выделенное пространство в to типа toTypeId. Возвращает true, если преобразование выполнено успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
void *QMetaType::create(int type, const void *copy = nullptr)
Возвращает копию copy, предполагая, что она является типом type. Если copy равно нулю, создаёт экземпляр по умолчанию.
См. также destroy(), isRegistered(), и Type.
void *QMetaType::create(const void *copy = ...) const
Возвращает копию copy, предполагая, что она является типом, для которого был создан этот экземпляр QMetaType. Если copy равно null, создаёт экземпляр по умолчанию.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::destroy().
bool QMetaType::debugStream(QDebug &dbg, const void *rhs, int typeId)
Выводит объект в адресе rhs типа typeId в поток отладки dbg. Возвращает true при успехе, в противном случае false.
Эта функция была добавлена в Qt 5.2.
void QMetaType::destroy(int type, void *data)
Удаляет data, предполагая, что он является типом type.
См. также create(), isRegistered(), и Type.
void QMetaType::destroy(void *data) const
Удаляет data, предполагая, что он является типом, для которого был создан этот экземпляр QMetaType.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::create().
void QMetaType::destruct(int type, void *where)
Удаляет значение заданного типа type, расположенное по адресу where.
В отличие от destroy(), эта функция только вызывает деструктор типа, она не вызывает оператор delete.
Эта функция была добавлена в Qt 5.0.
См. также construct().
void QMetaType::destruct(void *data) const
Удаляет значение, расположенное по адресу data, предполагая, что оно является типом, для которого был создан этот экземпляр QMetaType.
В отличие от destroy(), эта функция только вызывает деструктор типа, она не вызывает оператор delete.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::construct().
bool QMetaType::equals(const void *lhs, const void *rhs, int typeId, int *result)
Сравнивает объекты в адресах lhs и rhs. Оба объекта должны быть типа typeId. result устанавливается в ноль, если lhs равно rhs. Возвращает true, если сравнение выполнено успешно, в противном случае false.
Данная функция была представлена в Qt 5.5.
QMetaType::TypeFlags QMetaType::flags() const
Возвращает флаги типа, для которого был создан экземпляр QMetaType.
Данная функция была представлена в Qt 5.0.
См. также QMetaType::TypeFlags и QMetaType::typeFlags().
[static] bool QMetaType::hasRegisteredComparators()
Возвращает true, если система метаданных типов зарегистрировала компараторы для типа T.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredComparators(int typeId)
Возвращает true, если система метаданных типов зарегистрировала компараторы для типа с идентификатором typeId.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredConverterFunction(int fromTypeId, int toTypeId)
Возвращает true, если система метаданных типов имеет зарегистрированную функцию преобразования из метатипа с идентификатором fromTypeId в toTypeId
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredConverterFunction()
Возвращает true, если система метаданных типов имеет зарегистрированную функцию преобразования от типа From к типу To.
Это перегруженная функция.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredDebugStreamOperator()
Возвращает true, если система метаданных типов имеет зарегистрированный оператор вывода отладки для типа T.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredDebugStreamOperator(int typeId)
Возвращает true, если система метаданных типов имеет зарегистрированный оператор вывода отладки для типа с идентификатором typeId.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::isRegistered(int type)
Возвращает true, если тип данных с идентификатором type зарегистрирован; в противном случае возвращает false.
См. также type(), typeName(), и Type.
bool QMetaType::isRegistered() const
Возвращает true, если этот объект QMetaType содержит корректную информацию о типе, в противном случае возвращает false.
Данная функция была представлена в Qt 5.0.
bool QMetaType::isValid() const
Возвращает true если этот объект QMetaType содержит корректную информацию о типе, в противном случае возвращает false.
Данная функция была представлена в Qt 5.0.
[static] bool QMetaType::load(QDataStream &stream, int type, void *data)
Считывает объект указанного типа type из заданного потока stream в data. Возвращает true если объект загружен успешно; в противном случае возвращает false.
Тип должен быть зарегистрирован с помощью qRegisterMetaType() и qRegisterMetaTypeStreamOperators() предварительно.
Как правило, вам не нужно вызывать эту функцию напрямую. Вместо этого используйте operator>>() объекта QVariant, который полагается на load() для потоковой передачи пользовательских типов.
См. также save() и qRegisterMetaTypeStreamOperators().
const QMetaObject *QMetaType::metaObject() const
Возвращает QMetaObject для данного типа.
Если тип — указатель на подкласс QObject, flags() содержит QMetaType::PointerToQObject, и эта функция возвращает соответствующий QMetaObject. Это можно использовать в сочетании с QMetaObject::construct для создания QObject этого типа.
Если тип — Q_GADGET, flags() содержит QMetaType::IsGadget, и эта функция возвращает его QMetaObject. Это можно использовать для получения QMetaMethod и QMetaProperty и использовать их на указателе этого типа (например, полученного с помощью QVariant::data).
Если тип — перечисление, flags() содержит QMetaType::IsEnumeration, и эта функция возвращает QMetaObject содержащего объекта, если перечисление было зарегистрировано как Q_ENUM, иначе 0.
Данная функция была представлена в Qt 5.5.
См. также QMetaType::metaObjectForType() и QMetaType::flags().
[static] const QMetaObject *QMetaType::metaObjectForType(int type)
Возвращает QMetaType::metaObject для типа type.
Данная функция была представлена в Qt 5.0.
См. также metaObject().
[static] bool QMetaType::registerComparators()
Регистрирует операторы сравнения для зарегистрированного пользователем типа T. Требуется, чтобы у T были как оператор ==, так и оператор < . Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::registerConverter()
Регистрирует возможность неявного преобразования от типа From к типу To в системе метаданных типов. Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::registerConverter(MemberFunction function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function() const, как преобразование от типа From к типу To в системе метаданных типов. Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::registerConverter(MemberFunctionOk function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function(bool *ok) const, как преобразование от типа From к типу To в системе метаданных типов. Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::registerConverter(UnaryFunction function)
Это перегруженная функция.
Регистрирует унарную функцию function как преобразование от типа From к типу To в системе метаданных типов. Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::registerDebugStreamOperator()
Регистрирует оператор вывода отладки для зарегистрированного пользователем типа T. Требуется, чтобы у T был оператор <<(QDebug dbg, T). Возвращает true если регистрация прошла успешно, в противном случае false.
[static] bool QMetaType::registerEqualsComparator()
Регистрирует оператор равенства для зарегистрированного пользователем типа T. Требуется, чтобы у T был оператор ==. Возвращает true если регистрация прошла успешно, в противном случае false.
Данная функция была представлена в Qt 5.5.
[static] bool QMetaType::save(QDataStream &stream, int type, const void *data)
Записывает объект, на который указывает data с идентификатором type в заданный поток stream. Возвращает true если объект сохранен успешно; в противном случае возвращает false.
Тип должен быть зарегистрирован с помощью qRegisterMetaType() и qRegisterMetaTypeStreamOperators() предварительно.
Как правило, вам не нужно вызывать эту функцию напрямую. Вместо этого используйте operator<<() объекта QVariant, который полагается на save() для потоковой передачи пользовательских типов.
См. также load() и qRegisterMetaTypeStreamOperators().
[static] int QMetaType::sizeOf(int type)
Возвращает размер заданного типа type в байтах (т.е. sizeof(T), где T — фактический тип, идентифицируемый аргументом type).
Эта функция обычно используется вместе с construct() для низкоуровневого управления памятью, используемой типом.
Данная функция была представлена в Qt 5.0.
См. также construct().
END_OF_DOCUMENT_MARKERint QMetaType::sizeOf() const
Возвращает размер типа в байтах (т.е. sizeof(T), где T — фактический тип, для которого был создан этот экземпляр QMetaType).
Эта функция обычно используется вместе с construct() для низкоуровневого управления памятью, используемой типом.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::construct() и QMetaType::sizeOf().
[static] int QMetaType::type(const char *typeName)
Возвращает идентификатор типа с именем typeName или QMetaType::UnknownType, если такого типа нет.
См. также isRegistered(), typeName() и Type.
[static] int QMetaType::type(const ::QByteArray &typeName)
Это перегруженная функция.
Возвращает идентификатор типа с именем typeName или 0, если такого типа нет.
Эта функция была добавлена в Qt 5.5.
См. также isRegistered() и typeName().
[static] QMetaType::TypeFlags QMetaType::typeFlags(int type)
Возвращает флаги для данного типа type.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::TypeFlags.
[static] const char *QMetaType::typeName(int typeId)
Возвращает имя типа, связанное с заданным typeId, или нулевой указатель, если тип не найден. Возвращаемый указатель не должен удаляться.
См. также type(), isRegistered() и Type.
Связанные нечлены
int qMetaTypeId()
Возвращает метатип id типа T во время компиляции. Если тип не был объявлен с помощью Q_DECLARE_METATYPE(), компиляция завершится ошибкой.
Типичное использование:
int id = qMetaTypeId<QString>(); // id is now QMetaType::QString id = qMetaTypeId<MyStruct>(); // compile error if MyStruct not declared
QMetaType::type() возвращает тот же ID, что и qMetaTypeId(), но выполняет поиск во время выполнения на основе имени типа. QMetaType::type() немного медленнее, но компиляция завершается успешно, если тип не зарегистрирован.
Примечание: Эта функция безопасна для многопоточности.
Эта функция была добавлена в Qt 4.1.
См. также Q_DECLARE_METATYPE() и QMetaType::type().
int qRegisterMetaType(const char *typeName)
Регистрирует имя типа typeName для типа T. Возвращает внутренний ID, используемый QMetaType. Любой класс или структура, имеющий публичный конструктор по умолчанию, публичный конструктор копирования и публичный деструктор, может быть зарегистрирован.
Для этой функции требуется, чтобы T был полностью определён в момент вызова функции. Для указателей также требуется, чтобы тип, на который они указывают, был полностью определён. Используйте Q_DECLARE_OPAQUE_POINTER(), чтобы иметь возможность регистрировать указатели на заранее объявленные типы.
После регистрации типа вы можете динамически создавать и уничтожать объекты этого типа во время выполнения.
В этом примере регистрируется класс MyClass:
qRegisterMetaType<MyClass>("MyClass"); Эта функция полезна для регистрации псевдонимов (typedef), чтобы они могли быть использованы QMetaProperty или в QueuedConnections.
typedef QString CustomString;
qRegisterMetaType<CustomString>("CustomString"); Предупреждение: Эта функция полезна только для регистрации псевдонима (typedef). Для всех остальных случаев следует использовать Q_DECLARE_METATYPE и qMetaTypeId().
Примечание: Эта функция безопасна для многопоточности.
См. также qRegisterMetaTypeStreamOperators(), isRegistered() и Q_DECLARE_METATYPE().
int qRegisterMetaType()
Вызовите эту функцию для регистрации типа T. T должен быть объявлен с помощью Q_DECLARE_METATYPE(). Возвращает идентификатор метатипа.
Пример:
int id = qRegisterMetaType<MyStruct>();
Для этой функции требуется, чтобы T был полностью определён в момент вызова функции. Для указателей также требуется, чтобы тип, на который они указывают, был полностью определён. Используйте Q_DECLARE_OPAQUE_POINTER(), чтобы иметь возможность регистрировать указатели на заранее объявленные типы.
После регистрации типа вы можете динамически создавать и уничтожать объекты этого типа во время выполнения.
Для использования типа T в QVariant достаточно использовать Q_DECLARE_METATYPE(). Для использования типа T в очереди сигналов и слотов необходимо вызвать qRegisterMetaType<T>() перед установлением первого соединения.
Также для использования типа T с API QObject::property() необходимо вызвать qRegisterMetaType<T>() перед его использованием, обычно в конструкторе класса, который использует T, или в функции main().
Примечание: Эта функция безопасна для многопоточности.
Эта функция была добавлена в Qt 4.2.
См. также Q_DECLARE_METATYPE().
void qRegisterMetaTypeStreamOperators(const char *typeName)
Регистрирует операторы потокового ввода/вывода для типа T с именем typeName.
После этого тип можно передавать с помощью QMetaType::load() и QMetaType::save(). Эти функции используются при передаче QVariant.
qRegisterMetaTypeStreamOperators<MyClass>("MyClass"); Операторы потокового ввода/вывода должны иметь следующие сигнатуры:
QDataStream &operator<<(QDataStream &out, const MyClass &myObj); QDataStream &operator>>(QDataStream &in, MyClass &myObj);
Примечание: Эта функция безопасна для многопоточности.
См. также qRegisterMetaType(), QMetaType::isRegistered() и Q_DECLARE_METATYPE().
Документация макросов
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Контейнер)
Этот макрос делает контейнер Контейнер известным для QMetaType как ассоциативный контейнер. Это позволяет поместить экземпляр Container<T, U> в QVariant, если T и U сами известны QMetaType.
Обратите внимание, что все ассоциативные контейнеры Qt уже имеют встроенную поддержку, и использование этого макроса с ними не требуется. Контейнер std::map также имеет встроенную поддержку.
В этом примере показано типичное использование Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE():
#include <unordered_list>
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(std::unordered_map)
void someFunc()
{
std::unordered_map<int, bool> container;
QVariant var = QVariant::fromValue(container);
// ...
} Q_DECLARE_METATYPE(Тип)
Этот макрос делает тип Тип известным для QMetaType, при условии, что он предоставляет открытый конструктор по умолчанию, открытый конструктор копирования и открытый деструктор. Он необходим для использования типа Тип в качестве пользовательского типа в QVariant.
Этот макрос требует, чтобы Тип был полностью определённым типом в момент его использования. Для указателей на типы также требуется, чтобы указываемый тип был полностью определён. Используйте совместно с Q_DECLARE_OPAQUE_POINTER(), чтобы зарегистрировать указатели на типы, объявленные вперёд.
В идеале этот макрос следует размещать ниже объявления класса или структуры. Если это невозможно, его можно поместить в частный заголовочный файл, который необходимо включать каждый раз, когда этот тип используется в QVariant.
Добавление Q_DECLARE_METATYPE() делает тип известным для всех функций, основанных на шаблонах, включая QVariant. Обратите внимание, что если вы планируете использовать тип в очередных подключениях сигнала и слота или в системе свойств QObject, вам также необходимо вызвать qRegisterMetaType(), так как имена разрешаются во время выполнения.
В этом примере показан типичный случай использования Q_DECLARE_METATYPE():
struct MyStruct
{
int i;
...
};
Q_DECLARE_METATYPE(MyStruct) Если MyStruct находится в пространстве имён, макрос Q_DECLARE_METATYPE() должен быть вне пространства имён:
namespace MyNamespace
{
...
}
Q_DECLARE_METATYPE(MyNamespace::MyStruct) Так как MyStruct теперь известен QMetaType, он может использоваться в QVariant:
MyStruct s; QVariant var; var.setValue(s); // copy s into the variant ... // retrieve the value MyStruct s2 = var.value<MyStruct>();
Некоторые типы регистрируются автоматически и не требуют этого макроса:
- Указатели на классы, производные от QObject
- QList<T>, QVector<T>, QQueue<T>, QStack<T>, QSet<T> или QLinkedList<T>, где T – зарегистрированный метатип
- QHash<T1, T2>, QMap<T1, T2> или QPair<T1, T2>, где T1 и T2 – зарегистрированные метатипы
- QPointer<T>, QSharedPointer<T>, QWeakPointer<T>, где T – класс, производный от QObject
- Перечисления, зарегистрированные с помощью Q_ENUM или Q_FLAG
- Классы, для которых используется макрос Q_GADGET
См. также qRegisterMetaType().
Q_DECLARE_OPAQUE_POINTER(ТипУказателя)
Этот макрос позволяет регистрировать указатели на типы, объявленные вперёд (ТипУказателя), в QMetaType с помощью либо Q_DECLARE_METATYPE(), либо qRegisterMetaType().
Эта функция была добавлена в Qt 5.0.
См. также Q_DECLARE_METATYPE() и qRegisterMetaType().
Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Контейнер)
Этот макрос делает контейнер Контейнер известным для QMetaType как последовательный контейнер. Это позволяет поместить экземпляр Container<T> в QVariant, если T сам известен QMetaType.
Обратите внимание, что все последовательные контейнеры Qt уже имеют встроенную поддержку, и использование этого макроса с ними не требуется. Контейнеры std::vector и std::list также имеют встроенную поддержку.
В этом примере показано типичное использование Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE():
#include <deque>
Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(std::deque)
void someFunc()
{
std::deque<QFile*> container;
QVariant var = QVariant::fromValue(container);
// ...
} Q_DECLARE_SMART_POINTER_METATYPE(УмныйУказатель)
Этот макрос делает умный указатель УмныйУказатель известным для QMetaType как умный указатель. Это позволяет поместить экземпляр SmartPointer<T> в QVariant, если T – тип, который наследуется от QObject.
Обратите внимание, что QWeakPointer, QSharedPointer и QPointer уже имеют встроенную поддержку, и использование этого макроса с ними не требуется.
В этом примере показано типичное использование Q_DECLARE_SMART_POINTER_METATYPE():
#include <memory>
Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr)
void someFunc()
{
auto smart_ptr = std::make_shared<QFile>();
QVariant var = QVariant::fromValue(smart_ptr);
// ...
if (var.canConvert<QObject*>()) {
QObject *sp = var.value<QObject*>();
qDebug() << sp->metaObject()->className(); // Prints 'QFile'.
}
}
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qmetatype.html