Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются потокобезопасными.
Публичные типы
| Перечисление | Тип { Пусто, Булево, Целое, БеззнаковоеЦелое, ДвойнаяТочность, …, НеизвестныйТип } |
| Перечисление | ФлагиТипа { ТребуетсяКонструктор, ТребуетсяДеструктор, ПеремещаемыйТип, Перечисление, УказательНаQObject } |
| Флаги | ФлагиТипов |
Общедоступные функции
| 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 |
| int | id() 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) |
Подробное описание
Класс используется в качестве помощника для маршаллирования типов в 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::QCborValue |
53 |
QCborValue |
QMetaType::QCborArray |
54 |
QCborArray |
QMetaType::QCborMap |
55 |
QCborMap |
QMetaType::QCborSimpleType |
52 |
QCborSimpleType |
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 |
Тип TypeFlags — это тип-синоним для QFlags<TypeFlag>. Он хранит логическое ИЛИ комбинацию значений TypeFlag.
Документация по членам-функциям
QMetaType::QMetaType(const int typeId)
Конструирует объект QMetaType, который содержит всю информацию о типе typeId.
Эта функция была добавлена в Qt 5.0.
QMetaType::~QMetaType()
Деструктор этого объекта.
compare(const void *lhs, const void *rhs, int typeId, int *result)bool QMetaType::
Сравнивает объекты в lhs и rhs. Оба объекта должны быть типа typeId. result устанавливается меньше, равно или больше нуля, если lhs меньше, равно или больше rhs. Возвращает true, если сравнение прошло успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
construct(int type, void *where, const void *copy)void *QMetaType::
Конструирует значение заданного типа type в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это низкоуровневая функция для явного управления памятью, используемой для хранения типа. Рассмотрите вызов create(), если вам не нужен этот уровень управления (то есть, используйте «new», а не «placement new»).
Вы должны убедиться, что where указывает на место, которое может хранить значение типа type, и что where правильно выровнено. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания заключается в том, что тип выравнивается по своей естественной границе, которая представляет собой наименьшую степень двойки, большую, чем тип, если это выравнивание не превышает максимальное полезное выравнивание для платформы. Для практических целей выравнивание, большее, чем 2 * sizeof(void*), необходимо только для специальных инструкций оборудования (например, выравнивание загрузки и хранения SSE на x86).
Эта функция была добавлена в Qt 5.0.
См. также destruct() и sizeOf().
construct(void *where, const void *copy = ...) constvoid *QMetaType::
Конструирует значение типа, для которого был создан этот экземпляр QMetaType, в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это низкоуровневая функция для явного управления памятью, используемой для хранения типа. Рассмотрите вызов create(), если вам не нужен этот уровень управления (то есть, используйте «new», а не «placement new»).
Вы должны убедиться, что where указывает на место, где можно сохранить новое значение, и что where правильно выровнено. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания заключается в том, что тип выравнивается по своей естественной границе, которая представляет собой наименьшую степень двойки, большую, чем тип, если это выравнивание не превышает максимальное полезное выравнивание для платформы. Для практических целей выравнивание, большее, чем 2 * sizeof(void*), необходимо только для специальных инструкций оборудования (например, выравнивание загрузки и хранения SSE на x86).
Эта функция была добавлена в Qt 5.0.
convert(const void *from, int fromTypeId, void *to, int toTypeId)bool QMetaType::
Преобразует объект в from из fromTypeId в предварительно выделенное пространство в to типа toTypeId. Возвращает true, если преобразование прошло успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
create(int type, const void *copy = nullptr)void *QMetaType::
Возвращает копию copy, предполагая, что она является типа type. Если copy равно нулю, создаёт экземпляр, созданный по умолчанию.
См. также destroy(), isRegistered(), и Type.
create(const void *copy = ...) constvoid *QMetaType::
Возвращает копию copy, предполагая, что она является типа, для которого был создан этот экземпляр QMetaType. Если copy равно nullptr, создаёт экземпляр, созданный по умолчанию.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::destroy().
debugStream(QDebug &dbg, const void *rhs, int typeId)bool QMetaType::
Выводит объект в rhs типа typeId в поток отладки dbg. Возвращает true при успехе, в противном случае false.
Эта функция была добавлена в Qt 5.2.
destroy(int type, void *data)void QMetaType::
Удаляет data, предполагая, что он является типа type.
См. также create(), isRegistered(), и Type.
destroy(void *data) constvoid QMetaType::
Удаляет data, предполагая, что он является типа, для которого был создан этот экземпляр QMetaType.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::create().
destruct(int type, void *where)void QMetaType::
Деструктирует значение заданного типа type, расположенного по адресу where.
В отличие от destroy(), эта функция только вызывает деструктор типа, она не вызывает оператор delete.
Эта функция была добавлена в Qt 5.0.
См. также construct().
destruct(void *data) constvoid QMetaType::
Деструктирует значение по адресу data, предполагая, что оно является типа, для которого был создан этот экземпляр QMetaType.
В отличие от destroy(), эта функция только вызывает деструктор типа, она не вызывает оператор delete.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::construct().
END_OF_DOCUMENT_MARKER
[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] 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.
int QMetaType::id() const
Возвращает идентификатор типа, хранящийся в этом экземпляре QMetatype.
Эта функция была добавлена в Qt 5.13.
[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().
Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте QVariant's operator>>(), которая использует 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().
[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().
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.
Связанные нечленные функции
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().
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(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.14/qmetatype.html