Класс QMetaType
Класс QMetaType управляет именованными типами в системе метаобъектов. Подробнее...
| Заголовок: | #include <QMetaType> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются потокобезопасными.
Открытые типы
| перечисление | Тип { Пустое, Булево, Целое, БеззнаковоеЦелое, ДвойнаяТочность, …, НеизвестныйТип } |
| перечисление | ФлагТипа { ТребуетКонструктора, ТребуетДеструктора, ПеремещаемыйТип, ЭтоПеречисление, ЭтоБеззнаковоеПеречисление, …, ЭтоУказатель } |
| флаги | ФлагиТипа |
Открытые функции
| 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 | 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 | registerConverter(MemberFunction function) |
| bool | registerConverter(MemberFunctionOk function) |
| bool | registerConverter(UnaryFunction function) |
| bool | registerMutableView(MemberFunction function) |
| bool | registerMutableView(MemberFunctionOk function) |
| bool | registerMutableView(UnaryFunction function) |
| 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().
Документация по типам членов
enum 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().
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 |
Этот тип является указателем на другой тип. |
Тип 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.
Эта функция была добавлена в 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. Возвращаемый объект недействителен, если имя типа не известно 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.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 если тип данных с ID 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() предварительно.
Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте operator>>() QVariant, который полагается на 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.
[static, since 5.2] template <typename MemberFunction, int> bool QMetaType::registerConverter(MemberFunction function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function() const, как преобразователь из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
[static, since 5.2] template <typename MemberFunctionOk, char> bool QMetaType::registerConverter(MemberFunctionOk function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function(bool *ok) const, как преобразователь из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
[static, since 5.2] template <typename UnaryFunction> bool QMetaType::registerConverter(UnaryFunction function)
Это перегруженная функция.
Регистрирует объект унарной функции function как преобразователь из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 5.2.
[static, since 6.0] template <typename MemberFunction, int> bool QMetaType::registerMutableView(MemberFunction function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function() как изменяемый вид типа To на тип From в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 6.0.
[static, since 6.0] template <typename MemberFunctionOk, char> bool QMetaType::registerMutableView(MemberFunctionOk function)
Это перегруженная функция.
Регистрирует метод function, например, To From::function(bool *ok) как изменяемый вид типа To на тип From в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 6.0.
[static, since 6.0] template <typename UnaryFunction> bool QMetaType::registerMutableView(UnaryFunction function)
Это перегруженная функция.
Регистрирует объект унарной функции function как изменяемый вид типа To на тип From в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.
Эта функция была добавлена в Qt 6.0.
bool QMetaType::save(QDataStream &stream, const void *data) const
Записывает объект, на который указывает data, в заданный stream. Возвращает true если объект сохранен успешно; в противном случае возвращает false.
Тип должен быть зарегистрирован с помощью Q_DECLARE_METATYPE() предварительно.
Обычно вы не должны вызывать эту функцию напрямую. Вместо этого используйте operator<<() QVariant, которые полагаются на 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. Возвращает внутренний 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().
См. также 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.0/qmetatype.html