Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются потокобезопасными.
Общедоступные типы
| Перечисление | Type { Void, Bool, Int, UInt, Double, …, UnknownType } |
| Перечисление | TypeFlag { NeedsConstruction, NeedsDestruction, RelocatableType, IsEnumeration, IsUnsignedEnumeration, …, IsConst } |
| Флаги | TypeFlags |
Общедоступные функции
| QMetaType(int typeId) | |
| qsizetype | alignOf() const |
| QPartialOrdering | compare(const void *lhs, const void *rhs) const |
| void * | construct(void *where, const void *copy = nullptr) const |
| void * | create(const void *copy = nullptr) const |
| bool | debugStream(QDebug &dbg, const void *rhs) |
| void | destroy(void *data) const |
| void | destruct(void *data) const |
| bool | equals(const void *lhs, const void *rhs) const |
| QMetaType::TypeFlags | flags() const |
| bool | hasRegisteredDataStreamOperators() const |
| bool | hasRegisteredDebugStreamOperator() const |
| int | id() const |
| bool | isEqualityComparable() const |
| bool | isOrdered() const |
| bool | isRegistered() const |
| bool | isValid() const |
| bool | load(QDataStream &stream, void *data) const |
| const QMetaObject * | metaObject() const |
| const char * | name() const |
| bool | save(QDataStream &stream, const void *data) const |
| qsizetype | sizeOf() const |
Статические общедоступные члены
| bool | canConvert(QMetaType fromType, QMetaType toType) |
| bool | canView(QMetaType fromType, QMetaType toType) |
| bool | convert(QMetaType fromType, const void *from, QMetaType toType, void *to) |
| QMetaType | fromName(QByteArrayView typeName) |
| QMetaType | fromType() |
| bool | hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType) |
| bool | hasRegisteredConverterFunction() |
| bool | hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType) |
| bool | hasRegisteredMutableViewFunction() |
| bool | isRegistered(int type) |
| bool | registerConverter() |
| bool | view(QMetaType fromType, void *from, QMetaType toType, void *to) |
Связанные нечлены
| int | qMetaTypeId() |
| int | qRegisterMetaType(const char *typeName) |
| int | qRegisterMetaType() |
| bool | operator!=(QMetaType a, QMetaType b) |
| bool | operator==(QMetaType a, 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::Char16 |
56 |
char16_t |
QMetaType::Char32 |
57 |
char32_t |
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 |
0x100a |
QCursor |
QMetaType::QDate |
14 |
QDate |
QMetaType::QSize |
21 |
QSize |
QMetaType::QTime |
15 |
QTime |
QMetaType::QVariantList |
9 |
QVariantList |
QMetaType::QPolygon |
0x1007 |
QPolygon |
QMetaType::QPolygonF |
0x1016 |
QPolygonF |
QMetaType::QColor |
0x1003 |
QColor |
QMetaType::QColorSpace |
0x1017 |
QColorSpace (представлен в Qt 5.15) |
QMetaType::QSizeF |
22 |
QSizeF |
QMetaType::QRectF |
20 |
QRectF |
QMetaType::QLine |
23 |
QLine |
QMetaType::QTextLength |
0x100d |
QTextLength |
QMetaType::QStringList |
11 |
QStringList |
QMetaType::QVariantMap |
8 |
QVariantMap |
QMetaType::QVariantHash |
28 |
QVariantHash |
QMetaType::QIcon |
0x1005 |
QIcon |
QMetaType::QPen |
0x100c |
QPen |
QMetaType::QLineF |
24 |
QLineF |
QMetaType::QTextFormat |
0x100e |
QTextFormat |
QMetaType::QRect |
19 |
QRect |
QMetaType::QPoint |
25 |
QPoint |
QMetaType::QUrl |
17 |
QUrl |
QMetaType::QRegularExpression |
44 |
QRegularExpression |
QMetaType::QDateTime |
16 |
QDateTime |
QMetaType::QPointF |
26 |
QPointF |
QMetaType::QPalette |
0x1004 |
QPalette |
QMetaType::QFont |
0x1000 |
QFont |
QMetaType::QBrush |
0x1002 |
QBrush |
QMetaType::QRegion |
0x1008 |
QRegion |
QMetaType::QBitArray |
13 |
QBitArray |
QMetaType::QImage |
0x1006 |
QImage |
QMetaType::QKeySequence |
0x100b |
QKeySequence |
QMetaType::QSizePolicy |
0x2000 |
QSizePolicy |
QMetaType::QPixmap |
0x1001 |
QPixmap |
QMetaType::QLocale |
18 |
QLocale |
QMetaType::QBitmap |
0x1009 |
QBitmap |
QMetaType::QTransform |
0x1010 |
QTransform |
QMetaType::QMatrix4x4 |
0x1011 |
QMatrix4x4 |
QMetaType::QVector2D |
0x1012 |
QVector2D |
QMetaType::QVector3D |
0x1013 |
QVector3D |
QMetaType::QVector4D |
0x1014 |
QVector4D |
QMetaType::QQuaternion |
0x1015 |
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 |
65536 |
Базовое значение для пользовательских типов |
QMetaType::UnknownType |
0 |
Это неверный идентификатор типа. Он возвращается из QMetaType для типов, которые не зарегистрированы |
Дополнительные типы можно зарегистрировать, используя Q_DECLARE_METATYPE().
См. также type() и typeName().
enum QMetaType::TypeFlagflags QMetaType::TypeFlags
Перечисление описывает атрибуты типа, поддерживаемые QMetaType.
| Постоянная | Значение | Описание |
|---|---|---|
QMetaType::NeedsConstruction |
0x1 |
Этот тип имеет нетривиальные конструкторы. Если флаг не установлен, экземпляры можно безопасно инициализировать с помощью memset в 0. |
QMetaType::NeedsDestruction |
0x2 |
У этого типа есть нетривиальный деструктор. Если флаг не установлен, вызовы деструктора не необходимы перед удалением объектов. |
QMetaType::RelocatableType |
0x4 |
Экземпляр типа, имеющего этот атрибут, можно безопасно переместить в другое место памяти с помощью memcpy. |
QMetaType::IsEnumeration |
0x10 |
Этот тип является перечислением. |
QMetaType::IsUnsignedEnumeration |
0x100 |
Если тип является перечислением, его базовый тип является беззнаковым. |
QMetaType::PointerToQObject |
0x8 |
Этот тип является указателем на производный от QObject. |
QMetaType::IsPointer |
0x800 |
Этот тип является указателем на другой тип. |
QMetaType::IsConst |
0x2000 |
Указывает, что значения этого типа неизменяемы; например, потому что они являются указателями на объекты const. |
Тип TypeFlags является типом-синонимом для QFlags<TypeFlag>. Он хранит логическое ИЛИ комбинацию значений TypeFlag.
Документация по функциям-членам
[since 5.0] QMetaType::QMetaType(int typeId)
Создаёт объект QMetaType, содержащий всю информацию о типе typeId.
Эта функция была введена в Qt 5.0.
[since 6.0] qsizetype QMetaType::alignOf() const
Возвращает выравнивание типа в байтах (т.е. alignof(T), где T — фактический тип, для которого был создан этот экземпляр QMetaType).
Эта функция обычно используется вместе с construct() для выполнения низкоуровневого управления памятью, используемой типом.
Эта функция была введена в Qt 6.0.
См. также QMetaType::construct() и QMetaType::sizeOf().
[static] bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
Возвращает true, если QMetaType::convert может выполнить преобразование из fromType в toType.
Qt поддерживает следующие преобразования:
Поддержка преобразований между примитивными типами (int, float, bool и т. д.).
Преобразование между указателями на типы, производные от QObject, также вернет true для этой функции, если qobject_cast из типа, описанного параметром fromType, в тип, описанный параметром toType, был бы успешен.
Преобразование из последовательного контейнера также вернет true для этой функции, если toType равен QVariantList.
Аналогично, преобразование из ассоциативного контейнера также вернет true для этой функции, если toType равен QVariantHash или QVariantMap.
См. также convert(), QSequentialIterable, Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(), QAssociativeIterable и Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().
[static] bool QMetaType::canView(QMetaType fromType, QMetaType toType)
Возвращает true, если QMetaType::view может создать изменяемый вид типа toType на типе fromType.
Преобразование между указателями на типы, производные от QObject, вернёт true для этой функции, если qobject_cast из типа, описанного параметром fromType, в тип, описанный параметром toType, был бы успешен.
Вы можете создать изменяемый вид типа QSequentialIterable на любом контейнере, зарегистрированном с помощью Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE().
Аналогично, вы можете создать изменяемый вид типа QAssociativeIterable на любом контейнере, зарегистрированном с помощью Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().
См. также convert(), QSequentialIterable, Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(), QAssociativeIterable и Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE().
[since 6.0] QPartialOrdering QMetaType::compare(const void *lhs, const void *rhs) const
Сравнивает объекты по адресам lhs и rhs для определения порядка.
Возвращает QPartialOrdering::Unordered, если сравнение не поддерживается или значения не упорядочены. В противном случае возвращает QPartialOrdering::Less, QPartialOrdering::Equivalent или QPartialOrdering::Greater, если lhs меньше, эквивалентно или больше rhs соответственно.
Оба объекта должны быть типа, описанного этим метатипом. Если lhs или rhs равно nullptr, значения не упорядочены. Сравнение поддерживается только в том случае, если оператор меньше для типа был виден при объявлении метатипа.
Если оператор равенства для типа также был виден, значения будут равны только в том случае, если оператор равенства так указывает. При отсутствии оператора равенства, когда ни одно значение не меньше другого, значения считаются равными; если оператор равенства также доступен и два таких значения не равны, они считаются неупорядоченными, так же как значения NaN (не число) для типа с плавающей точкой лежат вне его порядка.
Примечание: Если оператор меньше не был виден при объявлении метатипа, значения не упорядочены, даже если оператор равенства, видимый при объявлении, считает их равными: compare() == 0 согласуется с equals() только в том случае, если оператор меньше был виден.
Эта функция была добавлена в Qt 6.0.
См. также equals() и isOrdered().
[since 5.0] void *QMetaType::construct(void *where, const void *copy = nullptr) const
Создаёт значение типа, для которого был создан экземпляр QMetaType, в имеющейся памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.
Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Используйте create(), если вам не нужен такой уровень управления (то есть, используйте «new» вместо «placement new»).
Вы должны убедиться, что where указывает на место, где можно сохранить новое значение, и что where имеет соответствующее выравнивание. Размер типа можно запросить, вызвав sizeOf().
Правило для выравнивания состоит в том, что тип выравнивается по своему естественному границе, которая является наименьшей степенью двойки, большей, чем размер типа, если это выравнивание не больше максимального полезного выравнивания для платформы. Для практических целей выравнивание, большее чем 2 * sizeof(void*), необходимо только для специальных инструкций аппаратного обеспечения (например, выравнивание SSE-загрузок и -хранений на x86).
Функция была добавлена в Qt 5.0.
[static, since 5.2] bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType, void *to)
Преобразует объект в from типа fromType в предварительно выделенное место по адресу to типа toType. Возвращает true, если преобразование прошло успешно, в противном случае возвращает false.
Оба указателя from и to должны быть валидными.
Функция была добавлена в Qt 5.2.
[since 5.0] void *QMetaType::create(const void *copy = nullptr) const
Возвращает копию copy, предполагая, что она относится к типу, для которого был создан экземпляр QMetaType. Если copy равно nullptr, создаёт экземпляр, созданный по умолчанию.
Функция была добавлена в Qt 5.0.
См. также QMetaType::destroy().
[since 5.2] bool QMetaType::debugStream(QDebug &dbg, const void *rhs)
Выводит объект по адресу rhs в отладочный поток dbg. Возвращает true при успехе, в противном случае false.
Функция была добавлена в Qt 5.2.
[since 5.0] void QMetaType::destroy(void *data) const
Удаляет data, предполагая, что он относится к типу, для которого был создан экземпляр QMetaType.
Функция была добавлена в Qt 5.0.
См. также QMetaType::create().
[since 5.0] void QMetaType::destruct(void *data) const
Удаляет значение, расположенное по адресу data, предполагая, что оно относится к типу, для которого был создан экземпляр QMetaType.
В отличие от destroy(), эта функция только вызывает деструктор типа, она не вызывает оператор delete.
Функция была добавлена в Qt 5.0.
См. также QMetaType::construct().
[since 6.0] bool QMetaType::equals(const void *lhs, const void *rhs) const
Сравнивает объекты по адресам lhs и rhs на равенство.
Оба объекта должны быть типа, описанного этим метатипом. Сравнение объектов возможно только если оператор меньше или равен был виден при объявлении метатипа. В противном случае метатип никогда не считает значения равными. Если оператор равенства был виден при объявлении метатипа, он имеет приоритет. В противном случае, если оператор меньше виден, когда ни одно значение не меньше другого, значения считаются равными. Если значения неупорядочены (см. compare() для подробностей), они не равны.
Возвращает true, если два объекта равны, в противном случае false.
Функция была добавлена в Qt 6.0.
См. также isEqualityComparable() и compare().
[since 5.0] QMetaType::TypeFlags QMetaType::flags() const
Возвращает флаги типа, для которого был создан экземпляр QMetaType.
Функция была добавлена в Qt 5.0.
См. также QMetaType::TypeFlags и QMetaType::flags().
[static] QMetaType QMetaType::fromName(QByteArrayView typeName)
Возвращает QMetaType, соответствующую typeName. Возвращаемый объект недействителен, если typeName не известен QMetaType.
[static, since 5.15] template <typename T> QMetaType QMetaType::fromType()
Возвращает QMetaType, соответствующую типу в параметре шаблона.
Функция была добавлена в Qt 5.15.
[static, since 5.2] bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)
Возвращает true, если система метатипов имеет зарегистрированное преобразование от метатипа fromType к toType.
Функция была добавлена в Qt 5.2.
[static, since 5.2] template <typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()
Возвращает true, если система метатипов имеет зарегистрированное преобразование от типа From к типу To.
Это перегруженная функция.
Функция была добавлена в Qt 5.2.
[since 6.1] bool QMetaType::hasRegisteredDataStreamOperators() const
Возвращает true, если система метатипов зарегистрировала операторы потоков данных для этого метатипа.
Функция была добавлена в Qt 6.1.
[since 6.0] bool QMetaType::hasRegisteredDebugStreamOperator() const
Возвращает true, если система метатипов зарегистрировала оператор отладочного потока для этого метатипа.
Функция была добавлена в Qt 6.0.
[static, since 5.2] bool QMetaType::hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)
Возвращает true, если система метатипов имеет зарегистрированную функцию изменяемого представления для метатипа fromType метатипа toType.
Функция была добавлена в Qt 5.2.
[static, since 6.0] template <typename From, typename To> bool QMetaType::hasRegisteredMutableViewFunction()
Возвращает true, если система метатипов имеет зарегистрированную функцию изменяемого представления для типа From типа To.
Это перегруженная функция.
Функция была добавлена в Qt 6.0.
[since 5.13] int QMetaType::id() const
Возвращает идентификатор типа, хранимый в экземпляре QMetatype.
Функция была добавлена в Qt 5.13.
bool QMetaType::isEqualityComparable() const
Возвращает true , если оператор меньше или равен для типа, описанного этим метатипом, был виден при объявлении метатипа; в противном случае false.
См. также equals() и isOrdered().
bool QMetaType::isOrdered() const
Возвращает true , если оператор меньше для типа, описанного этим метатипом, был виден при объявлении метатипа, в противном случае false.
См. также compare() и isEqualityComparable().
[static] bool QMetaType::isRegistered(int type)
Возвращает true , если тип данных с идентификатором type зарегистрирован, в противном случае возвращает false.
См. также type(), typeName() и Type.
[since 5.0] bool QMetaType::isRegistered() const
Возвращает true , если этот объект QMetaType содержит действительную информацию о типе, в противном случае false.
Функция была добавлена в Qt 5.0.
[since 5.0] bool QMetaType::isValid() const
Возвращает true , если этот объект QMetaType содержит действительную информацию о типе, в противном случае false.
Функция была добавлена в Qt 5.0.
bool QMetaType::load(QDataStream &stream, void *data) const
Считывает объект данного типа из заданного потока stream в data. Возвращает true если объект загружен успешно; в противном случае возвращает false.
Тип должен быть зарегистрирован с помощью Q_DECLARE_METATYPE() предварительно.
Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте QVariant's operator>>(), которая использует load() для потоковой передачи пользовательских типов.
См. также save().
[since 5.5] 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::flags().
[since 5.15] const char *QMetaType::name() const
Возвращает имя типа, связанное с этим QMetaType, или нулевой указатель, если соответствующий тип не найден. Возвращаемый указатель не должен быть удалён.
Эта функция была добавлена в Qt 5.15.
См. также typeName().
[static, since 5.2] template <typename From, typename To> bool QMetaType::registerConverter()
Регистрирует возможность неявного преобразования из типа From в тип To в системе метаданных. Возвращает true если регистрация прошла успешно, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.2.
bool QMetaType::save(QDataStream &stream, const void *data) const
Записывает объект, на который указывает data, в заданный поток stream. Возвращает true если объект сохранён успешно; в противном случае возвращает false.
Тип должен быть зарегистрирован с помощью Q_DECLARE_METATYPE() предварительно.
Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте QVariant's operator<<(), которая использует save() для потоковой передачи пользовательских типов.
См. также load().
[since 5.0] qsizetype QMetaType::sizeOf() const
Возвращает размер типа в байтах (т. е. sizeof(T), где T — фактический тип, для которого был создан этот экземпляр QMetaType).
Эта функция обычно используется вместе с construct() для выполнения низкоуровневого управления памятью, используемой типом.
Эта функция была добавлена в Qt 5.0.
См. также QMetaType::construct(), QMetaType::sizeOf() и QMetaType::alignOf().
[static, since 6.0] bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)
Создаёт изменяемый вид на объект в from типа fromType в предварительно выделенном пространстве в to типа toType. Возвращает true если преобразование выполнено успешно, в противном случае — false.
Эта функция была добавлена в Qt 6.0.
Связанные внешние функции
template <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() немного медленнее, но компиляция проходит успешно, если тип не зарегистрирован.
См. также Q_DECLARE_METATYPE() и QMetaType::type().
template <typename T> int qRegisterMetaType(const char *typeName)
Регистрирует имя типа typeName для типа T. Возвращает внутренний идентификатор, используемый QMetaType. Любой класс или структура, имеющие публичный конструктор по умолчанию, публичный конструктор копирования и публичный деструктор, могут быть зарегистрированы.
Для этой функции необходимо, чтобы T был полностью определён в момент вызова функции. Для указателей на типы также требуется, чтобы указанный тип был полностью определён. Используйте Q_DECLARE_OPAQUE_POINTER() для возможности регистрации указателей на типы, объявленные вперёд.
После регистрации типа вы можете динамически создавать и уничтожать объекты этого типа во время выполнения.
В данном примере регистрируется класс MyClass:
qRegisterMetaType<MyClass>("MyClass"); Эта функция полезна для регистрации псевдонимов (typedef), чтобы они могли быть использованы QMetaProperty или в соединениях QueuedConnections
typedef QString CustomString;
qRegisterMetaType<CustomString>("CustomString"); Предупреждение: Эта функция полезна только для регистрации псевдонимов (typedef). Для всех других случаев необходимо использовать Q_DECLARE_METATYPE и qMetaTypeId().
См. также isRegistered() и Q_DECLARE_METATYPE().
template <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().
См. также Q_DECLARE_METATYPE().
[since 5.15] bool operator!=(QMetaType a, QMetaType b)
Это перегруженная функция.
Возвращает true если QMetaType a представляет другой тип, чем QMetaType b, в противном случае возвращает false.
Эта функция была добавлена в Qt 5.15.
[since 5.15] bool operator==(QMetaType a, 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>, QQueue<T>, QStack<T> или QSet<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
Примечание: Этот метод также регистрирует операторы потока и отладки для типа, если они видны в момент регистрации. Поскольку это делается автоматически в некоторых местах, настоятельно рекомендуется объявлять операторы потока для типа непосредственно после самого типа. Из-за правил поиска аргументов языка C++, также настоятельно рекомендуется объявлять операторы в том же пространстве имён, что и сам тип.
Операторы потока должны иметь следующие подписи:
QDataStream &operator<<(QDataStream &out, const MyClass &myObj); QDataStream &operator>>(QDataStream &in, MyClass &myObj);
См. также qRegisterMetaType().
[since 5.0] 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-6.2/qmetatype.html