Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются потокобезопасными.
Открытые типы
| enum | Type { Void, Bool, Int, UInt, ..., UnknownType } |
| enum | TypeFlag { NeedsConstruction, NeedsDestruction, MovableType, IsEnumeration, PointerToQObject } |
| flags | TypeFlags |
Открытые функции
| QMetaType(const int typeId) | |
| ~QMetaType() | |
| void * | construct(void *where, const void *copy = Q_NULLPTR) const |
| void * | create(const void *copy = Q_NULLPTR) const |
| void | destroy(void *data) const |
| void | destruct(void *data) const |
| 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 = Q_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) |
| 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: Прочитайте документацию по QChar Прочитайте документацию по QChar
| Константа | Значение | Описание |
|---|---|---|
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::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 начиная с Qt 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, большей, чем тип, за исключением случаев, когда это выравнивание больше максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 2 * sizeof(void*) необходимо только для специальных аппаратных инструкций (например, выравнивания SSE-загрузок и -хранений на x86).
Эта функция была добавлена в Qt 5.0.
См. также destruct() и sizeOf().
void *QMetaType::construct(void *where, const void *copy = Q_NULLPTR) const
Создаёт значение типа, для которого был создан этот объект QMetaType, в существующей памяти по адресу where, которое является копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите использование create(), если вам не нужен этот уровень управления (то есть, используйте "new" вместо "placement new").
Вы должны убедиться, что where указывает на местоположение, куда можно сохранить новое значение, и что where правильно выровнен. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается до своего естественного предела, который является наименьшей степенью 2, большей, чем тип, за исключением случаев, когда это выравнивание больше максимального полезного выравнивания для платформы. Для практических целей выравнивание больше 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 = Q_NULLPTR)
Возвращает копию copy, предполагая, что она является типа type. Если copy равно нулю, создаёт экземпляр по умолчанию.
См. также destroy(), isRegistered(), и Type.
void *QMetaType::create(const void *copy = Q_NULLPTR) const
Возвращает копию copy, предполагая, что она является типа, для которого был создан этот объект QMetaType. Если copy равно нулю, создаёт экземпляр по умолчанию.
Эта функция была добавлена в 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.
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, если тип данных с 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, иначе 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 с ID 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] TypeFlags QMetaType::typeFlags(int type)
Возвращает флаги данного типа type.
Функция была представлена в Qt 5.0.
См. также QMetaType::TypeFlags.
[static] const char *QMetaType::typeName(int typeId)
Возвращает имя типа, связанное с данным typeId, или 0, если соответствующий тип не найден. Возвращаемый указатель не должен удаляться.
См. также 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() возвращает тот же 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(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/archives/qt-5.6/qmetatype.html