Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются потокобезопасными.
Открытые типы
| enum | Type { Void, Bool, Int, UInt, Double, …, UnknownType } |
| enum | TypeFlag { NeedsConstruction, NeedsDestruction, MovableType, IsEnumeration, PointerToQObject } |
| flags | TypeFlags |
Открытые функции
| QMetaType(const int typeId = QMetaType::UnknownType) | |
| ~QMetaType() | |
| void * | construct(void *where, const void *copy = 0) const |
| void * | create(const void *copy = 0) const |
| void | destroy(void *data) const |
| void | destruct(void *data) const |
| QMetaType::TypeFlags | flags() const |
| int | id() const |
| bool | isRegistered() const |
| bool | isValid() const |
| const QMetaObject * | metaObject() const |
| ::QByteArray | name() 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) |
| QMetaType | fromType() |
| 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) |
| bool | operator!=(const QMetaType &a, const QMetaType &b) |
| bool | operator==(const QMetaType &a, const QMetaType &b) |
Макросы
| 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) |
Подробное описание
Класс используется в качестве помощника для маршаллирования типов в 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::QColorSpace |
87 |
QColorSpace (введено в Qt 5.15) |
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::QCborValue |
53 |
QCborValue |
QMetaType::QCborArray |
54 |
QCborArray |
QMetaType::QCborMap |
55 |
QCborMap |
QMetaType::QCborSimpleType |
52 |
QCborSimpleType |
QMetaType::QModelIndex |
42 |
QModelIndex |
QMetaType::QPersistentModelIndex |
50 |
QPersistentModelIndex (введено в Qt 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 |
Тип TypeFlags является типом-синонимом для QFlags<TypeFlag>. Он хранит логическое ИЛИ комбинацию значений TypeFlag.
Документация по функциям-членам
QMetaType::QMetaType(const int typeId = QMetaType::UnknownType)
Создаёт объект QMetaType, содержащий всю информацию о типе typeId.
Примечание: Параметр по умолчанию был добавлен в Qt 5.15.
Эта функция была введена в Qt 5.0.
QMetaType::~QMetaType()
Деструктор этого объекта.
[static] bool QMetaType::compare(const void *lhs, const void *rhs, int typeId, int *result)
Сравнивает объекты в lhs и rhs. Оба объекта должны быть типа typeId. result устанавливается меньше, равно или больше нуля, если lhs меньше, равно или больше rhs. Возвращает true, если сравнение прошло успешно, иначе false.
Эта функция была введена в Qt 5.2.
[static] void *QMetaType::construct(int type, void *where, const void *copy)
Создаёт значение заданного типа type в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите возможность вызова create(), если вам не нужен такой уровень управления (то есть используйте "new" вместо "placement new").
Вы должны убедиться, что where указывает на местоположение, которое может хранить значение типа type, и что where должным образом выровнен. Размер типа можно получить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается до его естественной границы, которая является наименьшей степенью 2, большей, чем тип, если это выравнивание не превышает максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 2 * sizeof(void*) необходимо только для специальных инструкций оборудования (например, выровненных загрузках и сохранениях SSE на x86).
Эта функция была введена в Qt 5.0.
См. также destruct() и sizeOf().
void *QMetaType::construct(void *where, const void *copy = 0) const
Создаёт значение типа, для которого был создан этот экземпляр QMetaType, в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите возможность вызова create(), если вам не нужен такой уровень управления (то есть используйте "new" вместо "placement new").
Вы должны убедиться, что where указывает на местоположение, в котором можно хранить новое значение, и что where должным образом выровнен. Размер типа можно получить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается до его естественной границы, которая является наименьшей степенью 2, большей, чем тип, если это выравнивание не превышает максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 2 * sizeof(void*) необходимо только для специальных инструкций оборудования (например, выровненных загрузках и сохранениях SSE на x86).
Эта функция была введена в Qt 5.0.
[static] bool QMetaType::convert(const void *from, int fromTypeId, void *to, int toTypeId)
Преобразует объект в from из fromTypeId в предварительно выделенное пространство в to типа toTypeId. Возвращает true, если преобразование прошло успешно, в противном случае false.
Эта функция была введена в Qt 5.2.
[static] void *QMetaType::create(int type, const void *copy = nullptr)
Возвращает копию copy, предполагая, что она является типа type. Если copy равно нулю, создаёт экземпляр, созданный по умолчанию.
См. также destroy(), isRegistered(), и Type.
void *QMetaType::create(const void *copy = 0) const
Возвращает копию copy, предполагая, что она является типа, для которого был создан этот экземпляр QMetaType. Если copy равно nullptr, создаёт экземпляр, созданный по умолчанию.
Эта функция была введена в Qt 5.0.
См. также QMetaType::destroy().
[static] bool QMetaType::debugStream(QDebug &dbg, const void *rhs, int typeId)
Выводит объект по адресу rhs типа typeId в поток отладки dbg. Возвращает true при успехе, в противном случае false.
Эта функция была введена в Qt 5.2.
[static] 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().
[static] 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.
END_OF_DOCUMENT_MARKERДанная функция была представлена в Qt 5.0.
См. также QMetaType::construct().
[static] 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] template <typename T> QMetaType QMetaType::fromType()
Возвращает QMetaType, соответствующую типу в параметре шаблона.
Данная функция была представлена в Qt 5.15.
[static] template <typename T> 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] template <typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()
Возвращает true, если система метатипов зарегистрировала преобразование из типа From в тип To.
Это перегруженная функция.
Данная функция была представлена в Qt 5.2.
[static] template <typename T> bool QMetaType::hasRegisteredDebugStreamOperator()
Возвращает true, если система метатипов зарегистрировала оператор вывода в поток для отладки для типа T.
Данная функция была представлена в Qt 5.2.
[static] bool QMetaType::hasRegisteredDebugStreamOperator(int typeId)
Возвращает true, если система метатипов зарегистрировала оператор вывода в поток для отладки для типа с идентификатором typeId.
Данная функция была представлена в Qt 5.2.
int QMetaType::id() const
Возвращает идентификатор типа, хранимый экземпляром QMetatype.
Данная функция была представлена в Qt 5.13.
[static] bool QMetaType::isRegistered(int type)
Возвращает true если тип данных с ID 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, или nullptr в противном случае.
Данная функция была представлена в Qt 5.5.
См. также QMetaType::metaObjectForType() и QMetaType::flags().
[static] const QMetaObject *QMetaType::metaObjectForType(int type)
Возвращает QMetaType::metaObject для type.
Данная функция была представлена в Qt 5.0.
См. также metaObject().
::QByteArray QMetaType::name() const
Возвращает имя типа, связанное с этим QMetaType, или null указатель, если соответствующий тип не найден. Возвращённый указатель не должен удаляться.
Данная функция была представлена в Qt 5.15.
См. также typeName().
[static] template <typename T> bool QMetaType::registerComparators()
Регистрирует операторы сравнения для зарегистрированного пользователем типа T. Требуется, чтобы у типа T были перегружены операторы == и <. Возвращает true если регистрация прошла успешно, иначе false.
Данная функция была представлена в Qt 5.2.
[static] template <typename From, typename To> bool QMetaType::registerConverter()
Регистрирует возможность неявного преобразования из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, иначе false.
Данная функция была представлена в Qt 5.2.
[static] template <typename MemberFunction, int> bool QMetaType::registerConverter(MemberFunction function)
Это перегруженная функция.
Регистрирует метод function вида To From::function() const как преобразование из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, иначе false.
Данная функция была представлена в Qt 5.2.
[static] template <typename MemberFunctionOk, char> bool QMetaType::registerConverter(MemberFunctionOk function)
Это перегруженная функция.
Регистрирует метод function вида To From::function(bool *ok) const как преобразование из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, иначе false.
Данная функция была представлена в Qt 5.2.
[static] template <typename UnaryFunction> bool QMetaType::registerConverter(UnaryFunction function)
Это перегруженная функция.
Регистрирует унарную функцию function как преобразование из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, иначе false.
Данная функция была представлена в Qt 5.2.
[static] template <typename T> bool QMetaType::registerDebugStreamOperator()
Регистрирует оператор вывода в поток для отладки для зарегистрированного пользователем типа T. Требуется, чтобы у типа T был оператор <<(QDebug dbg, T). Возвращает true если регистрация прошла успешно, иначе false.
[static] шаблон <typename T> 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() предварительно.
Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте QVariant's operator<<(), которая полагается на save() для потоковой передачи пользовательских типов.
См. также load() и qRegisterMetaTypeStreamOperators().
[static] int QMetaType::sizeOf(int type)
Возвращает размер данного type в байтах (т.е. sizeof(T), где T — фактический тип, идентифицированный аргументом type).
Эта функция обычно используется совместно с construct() для выполнения низкоуровневого управления памятью, используемой типом.
Эта функция была добавлена в Qt 5.0.
См. также construct().
int 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 и name().
Связанные нечлен-функции
шаблон <typename T> int qMetaTypeId()
Возвращает идентификатор метатипа типа T во время компиляции. Если тип не объявлен с помощью Q_DECLARE_METATYPE(), компиляция завершится ошибкой.
Типичное использование:
int id = qMetaTypeId<QString>(); // id is now QMetaType::QString id = qMetaTypeId<MyStruct>(); // compile error if MyStruct not declared
QMetaType::type() возвращает тот же идентификатор, что и qMetaTypeId(), но выполняет поиск во время выполнения на основе имени типа. QMetaType::type() немного медленнее, но компиляция завершается успешно, если тип не зарегистрирован.
Эта функция была добавлена в Qt 4.1.
См. также Q_DECLARE_METATYPE() и QMetaType::type().
шаблон <typename T> 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().
шаблон <typename T> 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().
шаблон <typename T> 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().
bool operator!=(const QMetaType &a, const QMetaType &b)
Это перегруженная функция.
Возвращает true если QMetaType a представляет другой тип, чем QMetaType b, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.15.
bool operator==(const QMetaType &a, const QMetaType &b)
Это перегруженная функция.
Возвращает true если QMetaType a представляет тот же тип, что и QMetaType b, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.15.
Документация макросов
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)
Этот макрос делает контейнер Container известным для 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(Type)
Этот макрос делает тип Type известным для QMetaType, при условии, что он предоставляет публичный конструктор по умолчанию, публичный копирующий конструктор и публичный деструктор. Он необходим для использования типа Type в качестве пользовательского типа в QVariant.
Этот макрос требует, чтобы Type был полностью определён в момент его использования. Для типов указателей также требуется, чтобы тип, на который указывает указатель, был полностью определён. Используйте совместно с 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(PointerType)
Этот макрос позволяет регистрировать указатели на вперёд объявленные типы (PointerType) в QMetaType с помощью Q_DECLARE_METATYPE() или qRegisterMetaType().
Эта функция была добавлена в Qt 5.0.
См. также Q_DECLARE_METATYPE() и qRegisterMetaType().
Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container)
Этот макрос делает контейнер Container известным для 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(SmartPointer)
Этот макрос делает умный указатель SmartPointer известным для 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/qt-5.15/qmetatype.html