Spec-Zone.ru › Qt 5.13

Класс 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 = ...) const
void * create(const void *copy = ...) const
void destroy(void *data) const
void destruct(void *data) const
QMetaType::TypeFlags flags() const
int id() const
bool isRegistered() const
bool isValid() const
const QMetaObject * metaObject() const
int sizeOf() const

Статические открытые члены

bool compare(const void *lhs, const void *rhs, int typeId, int *result)
void * construct(int type, void *where, const void *copy)
bool convert(const void *from, int fromTypeId, void *to, int toTypeId)
void * create(int type, const void *copy = nullptr)
bool debugStream(QDebug &dbg, const void *rhs, int typeId)
void destroy(int type, void *data)
void destruct(int type, void *where)
bool equals(const void *lhs, const void *rhs, int typeId, int *result)
bool hasRegisteredComparators()
bool hasRegisteredComparators(int typeId)
bool hasRegisteredConverterFunction(int fromTypeId, int toTypeId)
bool hasRegisteredConverterFunction()
bool hasRegisteredDebugStreamOperator()
bool hasRegisteredDebugStreamOperator(int typeId)
bool isRegistered(int type)
bool load(QDataStream &stream, int type, void *data)
const QMetaObject * metaObjectForType(int type)
bool registerComparators()
bool registerConverter()
bool registerConverter(MemberFunction function)
bool registerConverter(MemberFunctionOk function)
bool registerConverter(UnaryFunction function)
bool registerDebugStreamOperator()
bool registerEqualsComparator()
bool save(QDataStream &stream, int type, const void *data)
int sizeOf(int type)
int type(const char *typeName)
int type(const ::QByteArray &typeName)
QMetaType::TypeFlags typeFlags(int type)
const char * typeName(int typeId)

Связанные внешние члены

int qMetaTypeId()
int qRegisterMetaType(const char *typeName)
int qRegisterMetaType()
void qRegisterMetaTypeStreamOperators(const char *typeName)

Макросы

Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)
Q_DECLARE_METATYPE(Type)
Q_DECLARE_OPAQUE_POINTER(PointerType)
Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container)
Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer)

Подробное описание

Класс используется в качестве помощника для маршаллирования типов в QVariant и при подключении сигналов и слотов в очереди. Он связывает имя типа с типом, чтобы его можно было создавать и уничтожать динамически во время выполнения. Объявляйте новые типы с помощью Q_DECLARE_METATYPE(), чтобы сделать их доступными для QVariant и других функций на основе шаблонов. Вызывайте qRegisterMetaType(), чтобы сделать типы доступными для функций, не основанных на шаблонах, таких как подключение сигналов и слотов в очереди.

Любой класс или структура, имеющие публичный конструктор по умолчанию, публичный конструктор копирования и публичный деструктор, может быть зарегистрирован.

Следующий код выделяет и уничтожает экземпляр MyClass:

int id = QMetaType::type("MyClass");
if (id != QMetaType::UnknownType) {
    void *myClassPtr = QMetaType::create(id);
    ...
    QMetaType::destroy(id, myClassPtr);
    myClassPtr = 0;
}

Если мы хотим, чтобы операторы потоков operator<<() и operator>>() работали с объектами QVariant, хранящими пользовательские типы, пользовательский тип должен предоставлять операторы operator<<() и operator>>().

См. также Q_DECLARE_METATYPE(), QVariant::setValue(), QVariant::value() и QVariant::fromValue().

Документация по типам-членам

перечисление QMetaType::Type

Это встроенные типы, поддерживаемые QMetaType:

Постоянная Значение Описание
QMetaType::Void 43 void
QMetaType::Bool 1 bool
QMetaType::Int 2 int
QMetaType::UInt 3 unsigned int
QMetaType::Double 6 double
QMetaType::QChar 7 QChar
QMetaType::QString 10 QString
QMetaType::QByteArray 12 QByteArray
QMetaType::Nullptr 51 std::nullptr_t
QMetaType::VoidStar 31 void *
QMetaType::Long 32 long
QMetaType::LongLong 4 LongLong
QMetaType::Short 33 short
QMetaType::Char 34 char
QMetaType::ULong 35 unsigned long
QMetaType::ULongLong 5 ULongLong
QMetaType::UShort 36 unsigned short
QMetaType::SChar 40 signed char
QMetaType::UChar 37 unsigned char
QMetaType::Float 38 float
QMetaType::QObjectStar 39 QObject *
QMetaType::QVariant 41 QVariant
QMetaType::QCursor 74 QCursor
QMetaType::QDate 14 QDate
QMetaType::QSize 21 QSize
QMetaType::QTime 15 QTime
QMetaType::QVariantList 9 QVariantList
QMetaType::QPolygon 71 QPolygon
QMetaType::QPolygonF 86 QPolygonF
QMetaType::QColor 67 QColor
QMetaType::QSizeF 22 QSizeF
QMetaType::QRectF 20 QRectF
QMetaType::QLine 23 QLine
QMetaType::QTextLength 77 QTextLength
QMetaType::QStringList 11 QStringList
QMetaType::QVariantMap 8 QVariantMap
QMetaType::QVariantHash 28 QVariantHash
QMetaType::QIcon 69 QIcon
QMetaType::QPen 76 QPen
QMetaType::QLineF 24 QLineF
QMetaType::QTextFormat 78 QTextFormat
QMetaType::QRect 19 QRect
QMetaType::QPoint 25 QPoint
QMetaType::QUrl 17 QUrl
QMetaType::QRegExp 27 QRegExp
QMetaType::QRegularExpression 44 QRegularExpression
QMetaType::QDateTime 16 QDateTime
QMetaType::QPointF 26 QPointF
QMetaType::QPalette 68 QPalette
QMetaType::QFont 64 QFont
QMetaType::QBrush 66 QBrush
QMetaType::QRegion 72 QRegion
QMetaType::QBitArray 13 QBitArray
QMetaType::QImage 70 QImage
QMetaType::QKeySequence 75 QKeySequence
QMetaType::QSizePolicy 121 QSizePolicy
QMetaType::QPixmap 65 QPixmap
QMetaType::QLocale 18 QLocale
QMetaType::QBitmap 73 QBitmap
QMetaType::QMatrix 79 QMatrix
QMetaType::QTransform 80 QTransform
QMetaType::QMatrix4x4 81 QMatrix4x4
QMetaType::QVector2D 82 QVector2D
QMetaType::QVector3D 83 QVector3D
QMetaType::QVector4D 84 QVector4D
QMetaType::QQuaternion 85 QQuaternion
QMetaType::QEasingCurve 29 QEasingCurve
QMetaType::QJsonValue 45 QJsonValue
QMetaType::QJsonObject 46 QJsonObject
QMetaType::QJsonArray 47 QJsonArray
QMetaType::QJsonDocument 48 QJsonDocument
QMetaType::QCborValue 53 QCborValue
QMetaType::QCborArray 54 QCborArray
END_OF_DOCUMENT_MARKER
QMetaType::QCborMap 55 QCborMap
QMetaType::QCborSimpleType 52 QCborSimpleType
QMetaType::QModelIndex 42 QModelIndex
QMetaType::QPersistentModelIndex 50 QPersistentModelIndex (с версии 5.5)
QMetaType::QUuid 30 QUuid
QMetaType::QByteArrayList 49 QByteArrayList
QMetaType::User 1024 Базовое значение для пользовательских типов
QMetaType::UnknownType 0 Это неверный идентификатор типа. Он возвращается из QMetaType для типов, которые не зарегистрированы

Дополнительные типы можно зарегистрировать, используя Q_DECLARE_METATYPE().

См. также type() и typeName().

enum QMetaType::TypeFlagflags QMetaType::TypeFlags

Перечисление описывает атрибуты типа, поддерживаемого QMetaType.

Константа Значение Описание
QMetaType::NeedsConstruction 0x1 У этого типа есть нетривиальные конструкторы. Если флаг не установлен, экземпляры можно безопасно инициализировать с помощью memset в 0.
QMetaType::NeedsDestruction 0x2 У этого типа есть нетривиальный деструктор. Если флаг не установлен, вызовы деструктора не нужны перед удалением объектов.
QMetaType::MovableType 0x4 Экземпляр типа, имеющего этот атрибут, можно безопасно перемещать с помощью memcpy.
QMetaType::IsEnumeration 0x10 Этот тип является перечислением
QMetaType::PointerToQObject 0x8 Этот тип является указателем на производный от QObject

Тип TypeFlags является псевдонимом для QFlags<TypeFlag>. Он хранит логическое ИЛИ комбинацию значений TypeFlag.

Документация по функциям-членам

QMetaType::QMetaType(const int typeId)

Создает объект QMetaType, содержащий всю информацию о типе typeId.

Эта функция была введена в Qt 5.0.

QMetaType::~QMetaType()

Деструктор этого объекта.

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 * sizeof(void*) необходимо только для специальных аппаратных инструкций (например, выравнивание загрузки и сохранения SSE на x86).

Эта функция была введена в Qt 5.0.

См. также destruct() и sizeOf().

void *QMetaType::construct(void *where, const void *copy = ...) const

Создаёт значение типа, для которого был создан экземпляр QMetaType, в существующей памяти по адресу where, являющееся копией copy, и возвращает where. Если copy равно нулю, значение создаётся по умолчанию.

Это функция низкого уровня для явного управления памятью, используемой для хранения типа. Рассмотрите вызов create(), если вам не нужен такой уровень управления (то есть используйте "new" вместо "placement new").

Вы должны убедиться, что where указывает на место, где можно хранить значение, и что where имеет соответствующее выравнивание. Размер типа можно запросить, вызвав sizeOf().

Правило для выравнивания — тип выравнивается до его естественной границы, которая является наименьшей степенью двойки, большей, чем тип, если это выравнивание не превышает максимальное полезное выравнивание для платформы. Для практических целей выравнивание больше 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 = nullptr)

Возвращает копию copy, предполагая, что она имеет тип type. Если copy равно нулю, создаётся экземпляр по умолчанию.

См. также destroy(), isRegistered(), и Type.

void *QMetaType::create(const void *copy = ...) const

Возвращает копию copy, предполагая, что она имеет тип, для которого был создан экземпляр QMetaType. Если copy равно nullptr, создаётся экземпляр по умолчанию.

Эта функция была введена в 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().

[static] bool QMetaType::equals(const void *lhs, const void *rhs, int typeId, int *result)

Сравнивает объекты по адресам lhs и rhs. Оба объекта должны быть типа typeId. result устанавливается в ноль, если lhs равен rhs. Возвращает true, если сравнение прошло успешно, в противном случае false.

Эта функция была добавлена в Qt 5.5.

QMetaType::TypeFlags QMetaType::flags() const

Возвращает флаги типа, для которого был создан этот экземпляр QMetaType.

Эта функция была добавлена в Qt 5.0.

См. также QMetaType::TypeFlags и QMetaType::typeFlags().

[static] bool QMetaType::hasRegisteredComparators()

Возвращает true, если система метатипов зарегистрировала компараторы для типа T.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::hasRegisteredComparators(int typeId)

Возвращает true, если система метатипов зарегистрировала компараторы для типа с идентификатором typeId.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::hasRegisteredConverterFunction(int fromTypeId, int toTypeId)

Возвращает true, если система метатипов зарегистрировала преобразование из метатипа с идентификатором fromTypeId в toTypeId

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::hasRegisteredConverterFunction()

Возвращает true, если система метатипов зарегистрировала преобразование из типа From в тип To.

Это перегруженная функция.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::hasRegisteredDebugStreamOperator()

Возвращает true, если система метатипов зарегистрировала оператор потока отладки для типа T.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::hasRegisteredDebugStreamOperator(int typeId)

Возвращает true, если система метатипов зарегистрировала оператор потока отладки для типа с идентификатором typeId.

Эта функция была добавлена в Qt 5.2.

int QMetaType::id() const

Возвращает идентификатор типа, хранящийся в этом экземпляре QMetatype.

Эта функция была добавлена в Qt 5.13.

[static] bool QMetaType::isRegistered(int type)

Возвращает true если тип с идентификатором type зарегистрирован; в противном случае возвращает false.

См. также type(), typeName(), и Type.

bool QMetaType::isRegistered() const

Возвращает true если этот объект QMetaType содержит корректную информацию о типе, в противном случае false.

Эта функция была добавлена в Qt 5.0.

bool QMetaType::isValid() const

Возвращает true если этот объект QMetaType содержит корректную информацию о типе, в противном случае false.

Эта функция была добавлена в Qt 5.0.

[static] bool QMetaType::load(QDataStream &stream, int type, void *data)

Считывает объект указанного типа type из потока stream в data. Возвращает true если объект загружен успешно; в противном случае возвращает false.

Тип должен быть предварительно зарегистрирован с помощью qRegisterMetaType() и qRegisterMetaTypeStreamOperators().

Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте QVariant's operator>>(), которая использует load() для потоковой передачи пользовательских типов.

См. также save() и qRegisterMetaTypeStreamOperators().

const QMetaObject *QMetaType::metaObject() const

Возвращает QMetaObject, связанный с этим типом.

Если тип является указателем на подкласс QObject, flags() содержит QMetaType::PointerToQObject, и эта функция возвращает соответствующий QMetaObject. Это можно использовать в сочетании с QMetaObject::construct для создания QObject этого типа.

Если тип является Q_GADGET, flags() содержит QMetaType::IsGadget, и эта функция возвращает его QMetaObject. Это можно использовать для получения QMetaMethod и QMetaProperty и использования их на указателе этого типа (например, с помощью QVariant::data).

Если тип является перечислением, flags() содержит QMetaType::IsEnumeration, и эта функция возвращает QMetaObject содержащего объекта, если перечисление было зарегистрировано как Q_ENUM, или nullptr в противном случае.

Эта функция была добавлена в Qt 5.5.

См. также QMetaType::metaObjectForType() и QMetaType::flags().

[static] const QMetaObject *QMetaType::metaObjectForType(int type)

Возвращает QMetaType::metaObject для type

Эта функция была добавлена в Qt 5.0.

См. также metaObject().

[static] bool QMetaType::registerComparators()

Регистрирует операторы сравнения для зарегистрированного пользователем типа T. Для этого требуется, чтобы у T были операторы == и <. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::registerConverter()

Регистрирует возможность неявного преобразования из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::registerConverter(MemberFunction function)

Это перегруженная функция.

Регистрирует метод function, как To From::function() const, в качестве преобразования из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::registerConverter(MemberFunctionOk function)

Это перегруженная функция.

Регистрирует метод function, как To From::function(bool *ok) const, в качестве преобразования из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::registerConverter(UnaryFunction function)

Это перегруженная функция.

Регистрирует объект унарной функции function в качестве преобразования из типа From в тип To в системе метатипов. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.2.

[static] bool QMetaType::registerDebugStreamOperator()

Регистрирует оператор потока отладки для зарегистрированного пользователем типа T. Для этого требуется, чтобы у T был оператор <<(QDebug dbg, T). Возвращает true если регистрация прошла успешно, в противном случае false.

[static] bool QMetaType::registerEqualsComparator()

Регистрирует оператор равенства для зарегистрированного пользователем типа T. Требуется, чтобы у T был оператор ==. Возвращает true если регистрация прошла успешно, в противном случае false.

Эта функция была добавлена в Qt 5.5.

[static] bool QMetaType::save(QDataStream &stream, int type, const void *data)

Записывает объект, на который указывает data с идентификатором type в указанный поток stream. Возвращает true если объект сохранен успешно; в противном случае возвращает false.

Тип должен быть предварительно зарегистрирован с помощью qRegisterMetaType() и qRegisterMetaTypeStreamOperators().

Обычно вам не нужно вызывать эту функцию напрямую. Вместо этого используйте operator<<() QVariant, которая полагается на save() для потоковой передачи пользовательских типов.

См. также load() и qRegisterMetaTypeStreamOperators().

[static] int QMetaType::sizeOf(int type)

Возвращает размер заданного типа type в байтах (т.е. sizeof(T), где T — фактический тип, идентифицированный аргументом type).

Эта функция обычно используется вместе с construct() для выполнения низкоуровневого управления памятью, используемой типом.

Эта функция была введена в Qt 5.0.

См. также construct().

int QMetaType::sizeOf() const

Возвращает размер типа в байтах (т.е. sizeof(T), где T — фактический тип, для которого был создан экземпляр QMetaType).

Эта функция обычно используется вместе с construct() для выполнения низкоуровневого управления памятью, используемой типом.

Эта функция была введена в Qt 5.0.

См. также QMetaType::construct() и QMetaType::sizeOf().

[static] int QMetaType::type(const char *typeName)

Возвращает дескриптор типа с именем typeName или QMetaType::UnknownType, если такого типа нет.

См. также isRegistered(), typeName() и Type.

[static] int QMetaType::type(const ::QByteArray &typeName)

Это перегруженная функция.

Возвращает дескриптор типа с именем typeName или 0, если такого типа нет.

Эта функция была введена в Qt 5.5.

См. также isRegistered() и typeName().

[static] QMetaType::TypeFlags QMetaType::typeFlags(int type)

Возвращает флаги данного типа type.

Эта функция была введена в Qt 5.0.

См. также QMetaType::TypeFlags.

[static] const char *QMetaType::typeName(int typeId)

Возвращает имя типа, связанное с заданным typeId, или нулевой указатель, если соответствующий тип не найден. Возвращаемый указатель не должен удаляться.

См. также type(), isRegistered() и Type.

Связанные нечлен-функции

int QMetaType::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 QMetaType::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 QMetaType::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 QMetaType::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().

END_OF_DOCUMENT_MARKER

Документация макросов

QMetaType::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);
    // ...
}

QMetaType::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().

QMetaType::Q_DECLARE_OPAQUE_POINTER(PointerType)

Этот макрос позволяет регистрировать указатели на вперёд объявленные типы (PointerType) в QMetaType с помощью Q_DECLARE_METATYPE() или qRegisterMetaType().

Эта функция была добавлена в Qt 5.0.

См. также Q_DECLARE_METATYPE() и qRegisterMetaType().

QMetaType::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);
    // ...
}

QMetaType::Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer)

Этот макрос делает умный указатель SmartPointer известным для QMetaType как умный указатель. Это позволяет поместить экземпляр SmartPointer<T> в QVariant, если T является типом, который наследуется от QObject.

Обратите внимание, что QWeakPointer, QSharedPointer и QPointer уже имеют встроенную поддержку, и использование этого макроса с ними не требуется.

Этот пример демонстрирует типичное использование Q_DECLARE_SMART_POINTER_METATYPE():

#include <memory>

Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr)

void someFunc()
{
    auto smart_ptr = std::make_shared<QFile>();
    QVariant var = QVariant::fromValue(smart_ptr);
    // ...
    if (var.canConvert<QObject*>()) {
        QObject *sp = var.value<QObject*>();
        qDebug() << sp->metaObject()->className(); // Prints 'QFile'.
    }
}

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qmetatype.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API