QMetaType 类

QMetaType 类管理元对象系统中的命名类型。 更多...

头文件 #include <QMetaType>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意: 该类中所有函数都是 线程安全

公共类型

枚举Type { Void, Bool, Int, UInt, Double, …, UnknownType }
枚举TypeFlag { NeedsConstruction, NeedsCopyConstruction, NeedsMoveConstruction, NeedsDestruction, RelocatableType, …, IsConst }
标志TypeFlags

公共函数

QMetaType(int typeId)
(since 6.0) QMetaType()
(since 6.0) qsizetypealignOf() const
(since 6.0) QPartialOrderingcompare(const void *lhs, const void *rhs) const
void *construct(void *where, const void *copy = nullptr) const
void *create(const void *copy = nullptr) const
booldebugStream(QDebug &dbg, const void *rhs)
voiddestroy(void *data) const
voiddestruct(void *data) const
(since 6.0) boolequals(const void *lhs, const void *rhs) const
QMetaType::TypeFlagsflags() const
(since 6.1) boolhasRegisteredDataStreamOperators() const
(since 6.0) boolhasRegisteredDebugStreamOperator() const
intid() const
(since 6.5) boolisCopyConstructible() const
(since 6.5) boolisDefaultConstructible() const
(since 6.5) boolisDestructible() const
boolisEqualityComparable() const
(since 6.5) boolisMoveConstructible() const
boolisOrdered() const
boolisRegistered() const
boolisValid() const
boolload(QDataStream &stream, void *data) const
const QMetaObject *metaObject() const
const char *name() const
(自6.5版本以来) voidregisterType() const
boolsave(QDataStream &stream, const void *data) const
qsizetypesizeOf() const
(自6.6版本以来) QMetaTypeunderlyingType() const

静态公共成员

boolcanConvert(QMetaType fromType, QMetaType toType)
boolcanView(QMetaType fromType, QMetaType toType)
boolconvert(QMetaType fromType, const void *from, QMetaType toType, void *to)
QMetaTypefromName(QByteArrayView typeName)
QMetaTypefromType()
boolhasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)
boolhasRegisteredConverterFunction()
boolhasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)
(since 6.0) boolhasRegisteredMutableViewFunction()
boolisRegistered(int type)
boolregisterConverter()
boolregisterConverter(To (From::*)() const function)
boolregisterConverter(To (From::*)(bool *) const function)
boolregisterConverter(UnaryFunction function)
(since 6.0) boolregisterMutableView(To (From::*)() function)
(since 6.0) boolregisterMutableView(UnaryFunction function)
(since 6.0) boolview(QMetaType fromType, void *from, QMetaType toType, void *to)
(自6.4版本以来) size_tqHash(QMetaType type, size_t seed = 0)
intqMetaTypeId()
intqRegisterMetaType()
(自6.5版本以来) intqRegisterMetaType(QMetaType meta)
booloperator!=(QMetaType a, QMetaType b)
(自6.5版本以来) QDebugoperator<<(QDebug d, QMetaType m)
booloperator==(QMetaType a, QMetaType b)

详细描述

该类用作辅助在QVariant和排队信号与槽连接中序列化类型。它将类型名与其类型相关联,以便在运行时动态创建和销毁。

类型名称可以使用 QMetaType 通过 qRegisterMetaType() 或 registerType() 进行注册。大多数操作不需要注册;只需要在尝试将类型名称解析回 QMetaType 对象或类型 ID 时才需要注册。这包括一些使用 QObject::connect() 的旧式信号-槽连接、从 QDataStream 读取用户类型到 QVariant 以及绑定到 QML、D-Bus、JavaScript 等其他语言和 IPC 机制的情况。

以下代码通过其名称分配和析构 MyClass 的一个实例,这要求之前已注册 MyClass

QMetaType type = QMetaType::fromName("MyClass");
if (type.isValid()) {
    void *myClassPtr = type.create();
    ...
    type.destroy(myClassPtr);
    myClassPtr = nullptr;
}

如果要让流运算符 operator<<()operator>>() 在存储自定义类型的 QVariant 对象上工作,则自定义类型必须提供 operator<<()operator>>() 运算符。

另请参阅Q_DECLARE_METATYPEQVariant::setValueQVariant::valueQVariant::fromValue

成员类型文档

enum QMetaType::Type

以下是 QMetaType 支持的内置类型

常量描述
QMetaType::Void43void
QMetaType::Bool1bool
QMetaType::Int2int
QMetaType::UInt3unsigned int
QMetaType::Double6double
QMetaType::QChar7QChar
QMetaType::QString10QString
QMetaType::QByteArray12QByteArray
QMetaType::Nullptr51std::nullptr_t
QMetaType::VoidStar31void *
QMetaType::Long32long
QMetaType::LongLong4LongLong
QMetaType::Short33short
QMetaType::Char34char
QMetaType::Char1656char16_t
QMetaType::Char3257char32_t
QMetaType::ULong35unsigned long
QMetaType::ULongLong5ULongLong
QMetaType::UShort36unsigned short
QMetaType::SChar40signed char
QMetaType::UChar37unsigned char
QMetaType::Float38float
QMetaType::Float1663qfloat16
QMetaType::QObjectStar39QObject *
QMetaType::QCursor0x100aQCursor
QMetaType::QDate14QDate
QMetaType::QSize21QSize
QMetaType::QTime15QTime
QMetaType::QVariantList9QVariantList
QMetaType::QPolygon0x1007QPolygon
QMetaType::QPolygonF0x1016QPolygonF
QMetaType::QColor0x1003QColor
QMetaType::QColorSpace0x1017QColorSpace(从 Qt 5.15 版本开始引入)
QMetaType::QSizeF22QSizeF
QMetaType::QRectF20QRectF
QMetaType::QLine23QLine
QMetaType::QTextLength0x100dQTextLength
QMetaType::QStringList11QStringList
QMetaType::QVariantMap8QVariantMap
QMetaType::QVariantHash28QVariantHash
QMetaType::QVariantPair58QVariantPair
QMetaType::QIcon0x1005QIcon
QMetaType::QPen0x100cQPen
QMetaType::QLineF24QLineF
QMetaType::QTextFormat0x100eQTextFormat
QMetaType::QRect19QRect
QMetaType::QPoint25QPoint
QMetaType::QUrl17QUrl
QMetaType::QRegularExpression44QRegularExpression
QMetaType::QDateTime16QDateTime
QMetaType::QPointF26QPointF
QMetaType::QPalette0x1004QPalette
QMetaType::QFont0x1000QFont
QMetaType::QBrush0x1002QBrush
QMetaType::QRegion0x1008QRegion
QMetaType::QBitArray13QBitArray
QMetaType::QImage0x1006QImage
QMetaType::QKeySequence0x100bQKeySequence
QMetaType::QSizePolicy0x2000QSizePolicy
QMetaType::QPixmap0x1001QPixmap
QMetaType::QLocale18QLocale
QMetaType::QBitmap0x1009QBitmap
QMetaType::QTransform0x1010QTransform
QMetaType::QMatrix4x40x1011QMatrix4x4
QMetaType::QVector2D0x1012QVector2D
QMetaType::QVector3D0x1013QVector3D
QMetaType::QVector4D0x1014QVector4D
QMetaType::QQuaternion0x1015QQuaternion
QMetaType::QEasingCurve29QEasingCurve
QMetaType::QJsonValue45QJsonValue
QMetaType::QJsonObject46QJsonObject
QMetaType::QJsonArray47QJsonArray
QMetaType::QJsonDocument48QJsonDocument
QMetaType::QCborValue53QCborValue
QMetaType::QCborArray54QCborArray
QMetaType::QCborMap55QCborMap
QMetaType::QCborSimpleType52QCborSimpleType
QMetaType::QModelIndex42QModelIndex
QMetaType::QPersistentModelIndex50QPersistentModelIndex (自 Qt 5.5 开始引入)
QMetaType::QUuid30QUuid
QMetaType::QByteArrayList49QByteArrayList
QMetaType::QVariant41QVariant
QMetaType::User65536用户类型的基础值
QMetaType::UnknownType0这是一个无效的类型ID。当类型未注册时,由QMetaType返回。

可以使用qRegisterMetaType()或调用registerType()注册更多类型。

另请参阅type()和typeName()。

枚举QMetaType::Span Classname
标志QMetaType::TypeFlags

该枚举描述了由QMetaType支持的类型的属性。

常量描述
QMetaType::NeedsConstruction0x1此类具有默认构造函数。如果未设置此标志,则可以使用memset将实例安全地初始化为0。
QMetaType::NeedsCopyConstruction0x4000(6.5及以后版本) 此类具有非平凡的复制构造函数。如果未设置此标志,则可以使用memcpy复制实例。
QMetaType::NeedsMoveConstruction0x8000(6.5及以后版本) 此类具有非平凡的移动构造函数。如果未设置此标志,则可以使用memcpy移动实例。
QMetaType::NeedsDestruction0x2此类具有非平凡的析构函数。如果未设置此标志,则在丢弃对象之前不需要调用析构函数。
QMetaType::RelocatableType0x4具有此属性的类型的实例可以安全地使用memcpy移动到不同的内存位置。
QMetaType::IsEnumeration0x10此类是枚举。
QMetaType::IsUnsignedEnumeration0x100如果类型是枚举,则其基础类型是无符号的。
QMetaType::PointerToQObject0x8此类是指向从QObject派生的类的指针。
QMetaType::IsPointer0x800此类是指向其他类型的指针。
QMetaType::IsConst0x2000表示此类值的不可变性;例如,因为它们是指向const对象。

注意:在Qt 6.5之前,如果复制的构造函数或析构函数非平凡,则都将设置NeedsConstruction和NeedsDestruction标志(即,如果类型非平凡)。

请注意,May标志可能已设置,但元类型可能没有公开可访问的相关类型的构造函数或公开可访问的析构函数。

类型标志(TypeFlags)类型是类型标志(TypeFlag)的别名,为模板类型 QFlags<TypeFlag>。它存储类型标志值的或组合。

成员函数文档

[显式] QMetaType::QMetaType(int typeId)

构建一个 QMetaType 对象,该对象包含有关类型 typeId 的所有信息。

[常量表达式 exception-safe, 自 6.0 版起] QMetaType::QMetaType()

构建一个默认的、无效的 QMetaType 对象。

此函数是在 Qt 6.0 版本中引入的。

[常量表达式, 自 6.0 版起] qsizetype QMetaType::alignOf() const

返回类型的字节对齐(即 alignof(T),其中 T 是为此 QMetaType 实例构建的实际类型)。

此函数通常与 construct() 一起使用,以执行类型使用的内存的低级管理。

此函数是在 Qt 6.0 版本中引入的。

另请参阅QMetaType::construct() 以及 QMetaType::sizeOf

[静态] bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)

如果 QMetaType::convert 可以从 fromType 转换到 toType,则返回 true

Qt 支持以下转换

类型自动转换到
QMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong
QMetaType::QByteArrayQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLongQMetaType::QUuid
QMetaType::QCharQMetaType::BoolQMetaType::IntQMetaType::UIntQMetaType::LongLongQMetaType::ULongLong
QMetaType::QColorQMetaType::QString
QMetaType::QDateQMetaType::QDateTimeQMetaType::QString
QMetaType::QDateTimeQMetaType::QDateQMetaType::QStringQMetaType::QTime
QMetaType::DoubleQMetaType::BoolQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong
QMetaType::QFontQMetaType::QString
QMetaType::IntQMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong
QMetaType::QKeySequenceQMetaType::IntQMetaType::QString
QMetaType::QVariantListQMetaType::QStringList(如果列表的项可以转换为 QStrings)
QMetaType::LongLongQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::QStringQMetaType::UIntQMetaType::ULongLong
QMetaType::QPointQMetaType::QPointF
QMetaType::QRectQMetaType::QRectF
QMetaType::QStringQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::QColorQMetaType::QDateQMetaType::QDateTimeQMetaType::DoubleQMetaType::QFontQMetaType::IntQMetaType::QKeySequenceQMetaType::LongLongQMetaType::QStringListQMetaType::QTimeQMetaType::UIntQMetaType::ULongLongQMetaType::QUuid
QMetaType::QStringListQMetaType::QVariantListQMetaType::QString(如果列表恰好包含一个项目)
QMetaType::QTimeQMetaType::QString
QMetaType::UIntQMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::ULongLong
QMetaType::ULongLongQMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UInt
QMetaType::QUuidQMetaType::QByteArrayQMetaType::QString

支持基本类型(int、float、bool等)之间的转换。

如果从QObject派生的类型之间的指针转换会成功,则此函数对于QMetaType中的转换也将返回真。

如果toTypeQVariantList,则从顺序容器到其的转换也将返回真。

类似地,如果从关联容器到其的转换会成功,则从关联容器到QVariantHashQVariantMap的转换也会返回真。

另请参阅convert()、QSequentialIterableQ_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()、QAssociativeIterableQ_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE

[静态] bool QMetaType::canView(QMetaType fromType, QMetaType toType)

如果QMetaType::view可以在类型fromType上创建一个类型toType的可变视图,则返回true

如果从类型fromType到类型toTypeqobject_cast会成功,则此函数对于从QObject派生的类型的指针转换也将返回真。

您可以在使用Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE注册的任何容器上创建类型QSequentialIterable的可变视图。

同样,您可以在任何已注册 Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 的容器上创建类型为 QAssociativeIterable 的可变视图。

另请参阅convert()、QSequentialIterableQ_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()、QAssociativeIterableQ_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE

[since 6.0] QPartialOrdering QMetaType::compare(const void *lhs, const void *rhs) const

比较 lhsrhs 处的对象的顺序。

如果比较不受支持或值是无序的,则返回 QPartialOrdering::Unordered。否则,如果 lhs 小于、等于或大于 rhs,则分别返回 QPartialOrdering::LessQPartialOrdering::EquivalentQPartialOrdering::Greater

两个对象都必须是此元类型的类型。如果 lhsrhsnullptr,则值为无序。只有当类型的小于运算符对元类型声明可见时,才支持比较。

如果类型的相等性运算符也对声明可见,则只有在相等性运算符认为它们相同时,值才会比较相等。在没有相等性运算符的情况下,当两个值都不小于对方时,值被认为相等;如果相等性也可用,并且这样的两个值不相等,则认为它们是无序的,就像浮点类型的 NaN (非数字) 值位于其排序之外一样。

注意:如果小于运算符对元类型声明不可见,即使相等性运算符认为它们相等,值也是无序的:compare() == 0 只有在小于运算符可见时才与 equals() 一致。

此函数是在 Qt 6.0 版本中引入的。

另请参阅:equals() 和 isOrdered()。

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

在由 where 指向的现有内存地址上构造此 QMetaType 实例所构造的类型值,即 copy 的副本,并返回 where。如果 copy 是零,则值是默认构造的。

这是一个用于显式管理存储类型的内存的低级函数。如果不需要此级别的控制(即使用 "new" 而不是 "placement new"),请考虑调用 create()。

您必须确保 where 指向一个可以存储新值的位置,并且 where 适合对齐。可以通过调用 sizeOf() 来查询类型的大小。

对齐的规则是一个类型对齐到其自然边界,即比类型大的最小的 2 的幂,除非这种对齐大于平台的最大有用对齐。为了实用目的,大于 2 * sizeof(void*) 的对齐仅在特殊的硬件指令(例如,x86 上的对齐 SSE 加载和存储)下是必要的。

[静态] bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType, void *to)

from 处的对象从 fromType 转换为 to 中预分配的具有 toType 类型空间。如果转换成功,则返回 true,否则返回 false

“从” “到” 都必须是有效的指针。

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

返回copy的副本,假设它是由此QMetaType实例创建的类型。如果copynullptr,则创建一个默认构造的实例。

另请参阅 QMetaType::destroy().

bool QMetaType::debugStream(QDebug &dbg, const void *rhs)

将位于rhs处的对象流到调试流dbg。成功时返回true,否则返回false。

void QMetaType::destroy(void *data) const

销毁data,假设它是为此QMetaType实例创建的类型。

另请参阅 QMetaType::create().

void QMetaType::destruct(void *data) const

销毁位于data处的值,假设它是为此QMetaType实例构建的类型。

与destroy()不同,此函数仅调用类型的析构函数,不调用删除运算符。

另请参阅 QMetaType::construct().

[since 6.0] bool QMetaType::equals(const void *lhs, const void *rhs) const

比较位于lhsrhs处的对象是否相等。

两个对象都必须是此元类型描述的类型。只有当类型的少于或等于操作符对元类型声明可见时,才能比较两个对象。否则,元类型永远不会考虑值相等。当等于操作符对元类型声明可见时,它是权威的;否则,如果少于操作符可见,当两个值都不少于对方时,它们被认为是相等的。如果值是无序的(有关详细信息,请参阅compare()),则它们不相等。

如果两个对象比较相等,则返回true,否则返回false。

此函数是在 Qt 6.0 版本中引入的。

另请参阅 isEqualityComparable() 和 compare().

[constexpr] QMetaType::TypeFlags QMetaType::flags() const

返回由此QMetaType实例创建的类型的标志。要检查特定类型特征,请使用“is-”函数之一,而不要直接使用标志。

另请参阅 QMetaType::TypeFlags、QMetaType::flags()、isDefaultConstructibleisCopyConstructibleisMoveConstructibleisDestructibleisEqualityComparableisOrdered

[静态] QMetaType QMetaType::fromName(QByteArrayView typeName)

返回与 typeName 匹配的 QMetaType。如果 QMetaType 未知 typeName,返回对象无效。

[静态常量模板] template <typename T> QMetaType QMetaType::fromType()

返回模板参数中类型的相应 QMetaType

[静态] bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)

如果元类型系统已注册从元类型id fromTypetoType 的转换,则返回 true。

[静态模板] template <typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()

如果元类型系统已注册从类型 From 到类型 To 的转换,则返回 true。

这是重载函数。

[自 6.1 版起] bool QMetaType::hasRegisteredDataStreamOperators() const

如果元类型系统已为该元类型注册数据流运算符,则返回 true。

此函数自 Qt 6.1 版本开始引入。

[自 6.0 版起] bool QMetaType::hasRegisteredDebugStreamOperator() const

如果元类型系统为该元类型注册了调试流运算符,则返回 true。

此函数是在 Qt 6.0 版本中引入的。

[静态] bool QMetaType::hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)

如果元类型系统已注册在元类型id fromType 上对元类型id toType 的可变视图,则返回 true。

[静态,自 6.0 版起] template <typename From, typename To> bool QMetaType::hasRegisteredMutableViewFunction()

如果元类型系统已注册在类型 To 中的类型 From 上的可变视图,则返回 true。

这是重载函数。

此函数是在 Qt 6.0 版本中引入的。

int QMetaType::id() const

返回此 QMetatype 实例持有的类型 id。

[不可抛出异常,自 6.5 版起] bool QMetaType::isCopyConstructible() const

如果此类型可以复制构造,则返回 true。如果可以,则可以使用具有非空参数的 construct() 和 create() 使用 copy。

此函数自 Qt 6.5 版本开始引入。

另请参阅 flags(),isDefaultConstructible(),isMoveConstructible() 和 isDestructible().

[noexcept, since 6.5] bool QMetaType::isDefaultConstructible() const

如果此类型可以默认构造,则返回 true。如果可以,则可以使用一个值为 null 的 copy 参数调用 construct() 和 create()。

此函数自 Qt 6.5 版本开始引入。

另请参阅flagsisCopyConstructibleisMoveConstructibleisDestructible

[noexcept, since 6.5] bool QMetaType::isDestructible() const

如果此类型可以被销毁,则返回 true。如果可以,则可以调用 destroy() 和 destruct()。

此函数自 Qt 6.5 版本开始引入。

另请参阅flagsisDefaultConstructibleisCopyConstructibleisMoveConstructible

bool QMetaType::isEqualityComparable() const

如果此元类型的描述类型可见于元类型声明中的小于或等于运算符,则返回 true,否则返回 false

另请参阅:equals() 和 isOrdered()。

[noexcept, since 6.5] bool QMetaType::isMoveConstructible() const

如果此类型可以移动构造,则返回 true。当前 QMetaType 没有使用此特质的 API。

此函数自 Qt 6.5 版本开始引入。

另请参阅flagsisDefaultConstructibleisCopyConstructibleisDestructible

bool QMetaType::isOrdered() const

如果此元类型的描述类型可见于元类型声明中的小于运算符,则返回 true,否则返回 false

另请参阅compare() 和 isEqualityComparable

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

如果 ID 为 type 的数据类型已注册,则返回 true;否则返回 false

另请参阅typetypeNameType

bool QMetaType::isRegistered() const

如果此 QMetaType 对象已注册到 Qt 全局元类型注册表,则返回 true。注册允许通过名称(使用 QMetaType::fromName)或 ID(使用构造函数)找到类型。

另请参阅qRegisterMetaTypeisValid

bool QMetaType::isValid() const

如果此 QMetaType 对象包含有关类型的有效信息,则返回 true,否则返回 false

另请参阅isRegistered

bool QMetaType::load(QDataStream &stream, void *data) const

将从给定stream读取此类型的对象到data中。如果对象加载成功则返回true,否则返回false

通常,您不需要直接调用此函数。相反,使用QVariant的运算符>>(),它依赖于load()来流处理自定义类型。

另请参阅save

[constexpr] const QMetaObject *QMetaType::metaObject() const

返回与此类型相关的QMetaObject

如果类型是指向QObject子类的指针类型,则flags()包含QMetaType::PointerToQObject,并且此函数返回相应的QMetaObject。这可以与QMetaObject::newInstance()一起使用来创建此类型的QObjects。

如果类型是Q_GADGET,则flags()包含QMetaType::IsGadget。如果类型是指向Q_GADGET的指针,则flags()包含QMetaType::PointerToGadget。在这两种情况下,此函数返回其QMetaObject。这可以用来检索QMetaMethodQMetaProperty,并用它们在指向此类型的指针上使用,例如由QVariant::data给出。

如果类型是枚举,则flags()包含QMetaType::IsEnumeration。在这种情况下,如果枚举被注册为Q_ENUM,则此函数返回封装对象的QMetaObject,否则返回nullptr

另请参阅QMetaType::flags

[constexpr] const char *QMetaType::name() const

返回与此QMetaType关联的类型名,或者如果没有找到匹配的类型则返回空指针。返回的指针不得删除。

另请参阅typeName

[static] 模板 <typename From, typename To> bool QMetaType::registerConverter()

在元类型系统中注册从类型From到类型To的隐式转换的可能性。如果注册成功则返回true,否则返回false。

class Counter {
  int number = 0;
public:
  int value() const { return number; }
  operator int() const { return value(); }
  void increment() {++number;}
};
QMetaType::registerConverter<Counter, int>();

[static] 模板 <typename From, typename To> bool QMetaType::registerConverter(To (From::*)() const function)

这是重载函数。

在元类型系统中注册类似于 To From::function() const 的方法 function 作为类型From到类型To的转换。如果注册成功则返回true,否则返回false。

struct Coordinates {
  int x;
  int y;
  int z;

  QString toString() const { return u"[x: %1; y: %2, z: %3]"_s.arg(QString::number(x),
    QString::number(y),
    QString::number(z)); }
};
QMetaType::registerConverter<Coordinates, QString>(&Coordinates::toString);

[static] 模板 <typename From, typename To> bool QMetaType::registerConverter(To (From::*)(bool *) const function)

这是重载函数。

在元类型系统中注册像 To From::function(bool *ok) const 一样的 function 方法作为从类型 From 到类型 To 的转换器。如果注册成功返回 true,否则返回 false。

ok 指针可以被函数用来指示转换是否成功。

struct BigNumber {
    long long l;

    int toInt(bool *ok = nullptr) const {
      const bool canConvertSafely = l < std::numeric_limits<int>::max();
      if (ok)
        *ok = canConvertSafely;
      return l;
    }
};
QMetaType::registerConverter<BigNumber, int>(&BigNumber::toInt);

[static] 模板 <typename From, typename To, typename UnaryFunction> bool QMetaType::registerConverter(UnaryFunction function)[a class="plink" href="#registerConverter-3" title="直接链接到此标题"]

这是重载函数。

在元类型系统中注册像 function 这样的单参数函数对象作为从类型 From 到类型 To 的转换器。如果注册成功返回 true,否则返回 false。

function 必须接受一个类型为 From 的实例,并返回一个类型为 To 的实例。它可以是一个函数指针、lambda 表达式或对象。自 Qt 6.5 起支持返回 std::optional<To> 类型,从而能够指示失败的转换。

QMetaType::registerConverter<CustomStringType, QString>([](const CustomStringType &str) {
    return QString::fromUtf8(str.data());
});
QMetaType::registerConverter<QJsonValue, QPointF>(
          [](const QJsonValue &value) -> std::optional<QPointF> {
    const auto object = value.toObject();
    if (!object.contains("x") || !object.contains("y"))
        return std::nullopt;  // The conversion fails if the required properties are missing
    return QPointF{object["x"].toDouble(), object["y"].toDouble()};
});

[static, since 6.0] 模板 <typename From, typename To> bool QMetaType::registerMutableView(To (From::*)() function)[a class="plink" href="#registerMutableView" title="直接链接到此标题"]

这是重载函数。

在元类型系统中注册像 To From::function() 一样的 function 方法,作为类型 From 上的类型 To 的可变视图。如果注册成功返回 true,否则返回 false

此函数是在 Qt 6.0 版本中引入的。

[static, since 6.0] 模板 <typename From, typename To, typename UnaryFunction> bool QMetaType::registerMutableView(UnaryFunction function)[a class="plink" href="#registerMutableView-1" title="直接链接到此标题"]

这是重载函数。

在元类型系统中注册像 function 这样的单参数函数对象,作为类型 From 上类型 To 的可变视图。如果注册成功返回 true,否则返回 false。

此函数是在 Qt 6.0 版本中引入的。

[since 6.5] void QMetaType::registerType() const[a class="plink" href="#registerType" title="直接链接到此标题"]

注册此 QMetaType 至类型注册器,使其可以通过名称查找,使用 QMetaType::fromName

此函数自 Qt 6.5 版本开始引入。

参阅 qRegisterMetaType

bool QMetaType::save(QDataStream &stream, const void *data) const[a class="plink" href="#save" title="直接链接到此标题"]

data 指向的对象写入给定的 stream。如果对象成功保存返回 true,否则返回 false

通常情况下,您不需要直接调用此函数。相反,使用 QVariantoperator<<(),它依赖于该函数来序列化自定义类型。

参阅 load

[constexpr] qsizetype QMetaType::sizeOf() const[a class="plink" href="#sizeOf-1" title="直接链接到此标题"]

返回类型的字节大小(即 sizeof(T),其中 T 是为该 QMetaType 实例构造的实际类型)。

此函数通常与 construct() 一起使用,以执行类型使用的内存的低级管理。

参阅 QMetaType::construct(),QMetaType::sizeOf() 和 QMetaType::alignOf

[since 6.6] QMetaType QMetaType::underlyingType() const[a class="plink" href="#underlyingType" title="直接链接到此标题"]

如果此元类型表示枚举类型,则此方法返回与枚举基类型具有相同符号和大小值的数字类的元类型。如果它表示QFlags类型,则返回QMetaType::Int。在其他所有情况下返回无效的QMetaType

此函数在Qt 6.6中引入。

[静态,自6.0起] bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)

创建对位于fromfromType对象的可变视图,并在to类型预分配空间中。如果转换成功返回true,否则返回false。

此函数是在 Qt 6.0 版本中引入的。

相关非成员

[自6.4起] size_t qHash(QMetaType type, size_t seed = 0)

使用seed来初始化计算,返回type的哈希值。

此函数在Qt 6.4中引入。

[constexpr] 模板 <typename T> int qMetaTypeId()

在编译时返回类型T的元类型id。如果没有使用Q_DECLARE_METATYPE()声明该类型,则编译将失败。

典型用法

int id = qMetaTypeId<QString>();    // id is now QMetaType::QString
id = qMetaTypeId<MyStruct>();       // compile error if MyStruct not declared

QMetaType::type()返回与qMetaTypeId()相同的ID,但它基于类型的名称在运行时进行查找。QMetaType::type()要慢一些,但如果没有注册类型,则编译将成功。

另请参阅Q_DECLARE_METATYPE() 和 QMetaType::type

[constexpr] 模板 <typename T> int qRegisterMetaType()

调用此函数以注册类型T。返回元类型Id。

示例

int id = qRegisterMetaType<MyStruct>();

此函数要求在调用此函数的点处,类型T是完整定义的。对于指针类型,还需要指向的类型是完整的。使用Q_DECLARE_OPAQUE_POINTER()能够注册指向仅声明的类型的指针。

要在QMetaTypeQVariant 或使用QObject::property() API中使用类型T,不需要注册。

要在排队的信号和槽连接中使用类型T,必须在建立第一个连接之前调用qRegisterMetaType<T>()。通常在使用T的类的构造函数中,或在main()函数中这样做。

在注册了一个类型之后,可以通过其名称使用QMetaType::fromName()找到它。

另请参阅Q_DECLARE_METATYPE

[自6.5起] int qRegisterMetaType(QMetaType meta)

注册元类型meta并返回其类型Id。

此函数要求在调用此函数的点处,类型T是完整定义的。对于指针类型,还需要指向的类型是完整的。使用Q_DECLARE_OPAQUE_POINTER()能够注册指向仅声明的类型的指针。

要在QMetaTypeQVariant 或使用QObject::property() API中使用类型T,不需要注册。

要在排队的信号和槽连接中使用类型T,必须在建立第一个连接之前调用qRegisterMetaType<T>()。通常在使用T的类的构造函数中,或在main()函数中这样做。

在注册了一个类型之后,可以通过其名称使用QMetaType::fromName()找到它。

此函数自 Qt 6.5 版本开始引入。

bool operator!=(QMetaType a, QMetaType b)

这是重载函数。

如果 QMetaType a 表示的类型与 QMetaType b 不同,则返回 true,否则返回 false

[since 6.5] QDebug operator<<(QDebug d, QMetaType m)

QMetaType m 写入流 d 中,并返回该流。

此函数自 Qt 6.5 版本开始引入。

bool operator==(QMetaType a, QMetaType b)

这是重载函数。

如果 QMetaType a 表示的类型与 QMetaType b 相同,则返回 true,否则返回 false

宏文档

Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)

此宏使容器 ContainerQMetaType 中被视为关联容器。这使得能够在 T 和 U 本身已知 QMetaType 的情况下,将 Container 的一个实例放入 QVariant 中。

请注意,所有 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>();

某些类型会自动注册,无需此宏

注意:此方法还会在注册时类型可见的情况下为该类型注册流和调试运算符。鉴于这是在某些地方自动完成的,因此强烈建议在类型本身之后直接声明该类型的流运算符。由于C++的依赖参数查找规则,也强烈建议在类型本身的同一命名空间中声明运算符。

流运算符应具有以下签名

QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);

参阅 qRegisterMetaType

Q_DECLARE_OPAQUE_POINTER(PointerType)

此宏启用使用QMetaType注册使用括号内的Prior declared type (PointerType)的指针,可以使用括号内的Prior declared type (PointerType)使用Q_DECLARE_METATYPE()或qRegisterMetaType ()。

另请参阅 Q_DECLARE_METATYPE()和qRegisterMetaType()。

Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(Container)

此宏使容器Container在QMetaType中作为一个顺序容器而知名。这使得如果T本身是QMetaType所知的,则可以将Container<T>的实例放入一个QVariant中。

请注意,所有的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中作为一个智能指针而知名。如果T是一个继承自QObject的类型,则可以将SmartPointer<T>的实例放入一个QVariant中。

请注意,QWeakPointerQSharedPointerQPointer已经有了内置支持,并且与它们使用此宏不是必需的。

此示例显示了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'.
    }
}

© 2024 Qt公司有限公司。本文件中包含的文档贡献是各自所有者版权的拥有者。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款许可的。Qt和相关标志是Qt公司在芬兰以及在全球的其它国家的商标。所有其他商标都是其各自所有者的财产。