QMetaType Class
QMetaType 类负责管理元对象系统中的命名类型。更多内容...
| 头文件: | #include <QMetaType> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
注意:本类中的所有函数均是线程安全的。
QMetaType 比较
| 类别 | 可比较类型 |
|---|---|
| 相等性 | QMetaType |
公共类型
| enum | Type { Void, Bool, Int, UInt, Double, …, UnknownType } |
| enum | TypeFlag { NeedsConstruction, NeedsCopyConstruction, NeedsMoveConstruction, NeedsDestruction, RelocatableType, …, IsConst } |
| flags | TypeFlags |
公共函数
(since 6.0) | QMetaType() |
| QMetaType(int typeId) | |
(since 6.0) qsizetype | alignOf() const |
(since 6.0) 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 |
(since 6.0) bool | equals(const void *lhs, const void *rhs) const |
| QMetaType::TypeFlags | flags() const |
(since 6.1) bool | hasRegisteredDataStreamOperators() const |
(since 6.0) bool | hasRegisteredDebugStreamOperator() const |
| int | id() const |
(since 6.5) bool | isCopyConstructible() const |
(since 6.5) bool | isDefaultConstructible() const |
(since 6.5) bool | isDestructible() const |
| bool | isEqualityComparable() const |
(since 6.5) bool | isMoveConstructible() 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 |
(since 6.5) void | registerType() const |
| bool | save(QDataStream &stream, const void *data) const |
| qsizetype | sizeOf() const |
(since 6.6) QMetaType | underlyingType() 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) |
(since 6.0) bool | hasRegisteredMutableViewFunction() |
| bool | isRegistered(int type) |
| bool | registerConverter() |
| bool | registerConverter(To (From::*function)() const) |
| bool | registerConverter(To (From::*function)(bool *) const) |
| bool | registerConverter(UnaryFunction function) |
(since 6.0) bool | registerMutableView(To (From::*function)()) |
(since 6.0) bool | registerMutableView(UnaryFunction function) |
(since 6.0) bool | view(QMetaType fromType, void *from, QMetaType toType, void *to) |
相关的非成员
(since 6.4) size_t | qHash(QMetaType key, size_t seed = 0) |
| int | qMetaTypeId() |
| int | qRegisterMetaType() |
(since 6.5) int | qRegisterMetaType(QMetaType meta) |
| bool | operator!=(const QMetaType &lhs, const QMetaType &rhs) |
(since 6.5) QDebug | operator<<(QDebug d, QMetaType m) |
| bool | operator==(const QMetaType &lhs, const QMetaType &rhs) |
宏
| 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 以及队列化的信号与槽连接中进行类型序列化。它将类型名称与类型关联起来,以便在运行时动态创建和销毁该类型。
可以通过调用 `qRegisterMetaType()` 或 `registerType()` 将类型名称注册到 `QMetaType` 上。对于大多数操作而言,注册并非必需;仅当操作试图将字符串形式的类型名称解析回 `QMetaType` 对象或该类型的 ID 时,才需要进行注册。 这些操作包括使用QObject::connect() 建立的一些旧式信号-插槽连接、从QDataStream 到QVariant 读取用户类型,或者绑定到其他语言和 IPC 机制,如 QML、D-Bus、JavaScript 等。
以下代码通过名称分配和销毁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_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::Float16 | 63 | qfloat16 |
QMetaType::QObjectStar | 39 | QObject * |
QMetaType::QBitArray | 13 | QBitArray |
QMetaType::QBitmap | 0x1009 | QBitmap |
QMetaType::QBrush | 0x1002 | QBrush |
QMetaType::QByteArrayList | 49 | QByteArrayList |
QMetaType::QCborArray | 54 | QCborArray |
QMetaType::QCborMap | 55 | QCborMap |
QMetaType::QCborSimpleType | 52 | QCborSimpleType |
QMetaType::QCborValue | 53 | QCborValue |
QMetaType::QColor | 0x1003 | QColor |
QMetaType::QColorSpace | 0x1017 | QColorSpace(自 Qt 5.15 起引入) |
QMetaType::QCursor | 0x100a | QCursor |
QMetaType::QDate | 14 | QDate |
QMetaType::QDateTime | 16 | QDateTime |
QMetaType::QEasingCurve | 29 | QEasingCurve |
QMetaType::QFont | 0x1000 | QFont |
QMetaType::QIcon | 0x1005 | QIcon |
QMetaType::QImage | 0x1006 | QImage |
QMetaType::QJsonArray | 47 | QJsonArray |
QMetaType::QJsonDocument | 48 | QJsonDocument |
QMetaType::QJsonObject | 46 | QJsonObject |
QMetaType::QJsonValue | 45 | QJsonValue |
QMetaType::QKeySequence | 0x100b | QKeySequence |
QMetaType::QLine | 23 | QLine |
QMetaType::QLineF | 24 | QLineF |
QMetaType::QLocale | 18 | QLocale |
QMetaType::QMatrix4x4 | 0x1011 | QMatrix4x4 |
QMetaType::QModelIndex | 42 | QModelIndex |
QMetaType::QPalette | 0x1004 | QPalette |
QMetaType::QPen | 0x100c | QPen |
QMetaType::QPersistentModelIndex | 50 | QPersistentModelIndex(自 Qt 5.5 起引入) |
QMetaType::QPixmap | 0x1001 | QPixmap |
QMetaType::QPoint | 25 | QPoint |
QMetaType::QPointF | 26 | QPointF |
QMetaType::QPolygon | 0x1007 | QPolygon |
QMetaType::QPolygonF | 0x1016 | QPolygonF |
QMetaType::QQuaternion | 0x1015 | QQuaternion |
QMetaType::QRect | 19 | QRect |
QMetaType::QRectF | 20 | QRectF |
QMetaType::QRegion | 0x1008 | QRegion |
QMetaType::QRegularExpression | 44 | QRegularExpression |
QMetaType::QSize | 21 | QSize |
QMetaType::QSizeF | 22 | QSizeF |
QMetaType::QSizePolicy | 0x2000 | QSizePolicy |
QMetaType::QStringList | 11 | QStringList |
QMetaType::QTextFormat | 0x100e | QTextFormat |
QMetaType::QTextLength | 0x100d | QTextLength |
QMetaType::QTime | 15 | QTime |
QMetaType::QTransform | 0x1010 | QTransform |
QMetaType::QUrl | 17 | QUrl |
QMetaType::QUuid | 30 | QUuid |
QMetaType::QVariant | 41 | QVariant |
QMetaType::QVariantHash | 28 | QVariantHash |
QMetaType::QVariantList | 9 | QVariantList |
QMetaType::QVariantMap | 8 | QVariantMap |
QMetaType::QVariantPair | 58 | QVariantPair |
QMetaType::QVector2D | 0x1012 | QVector2D |
QMetaType::QVector3D | 0x1013 | QVector3D |
QMetaType::QVector4D | 0x1014 | QVector4D |
QMetaType::User | 65536 | 用户类型的基值 |
QMetaType::UnknownType | 0 | 这是一个无效的类型 ID。对于未注册的类型,QMetaType 会返回此值 |
可通过调用qRegisterMetaType()或registerType()注册其他类型。
另请参阅 type()。
enum QMetaType::TypeFlag
flags QMetaType::TypeFlags
该枚举描述了QMetaType 所支持的类型的属性。
| 常量 | 值 | 描述 |
|---|---|---|
QMetaType::NeedsConstruction | 0x1 | 该类型具有默认构造函数。如果未设置此标志,则可以使用 memset 将其实例安全地初始化为 0。 |
QMetaType::NeedsCopyConstruction (since Qt 6.5) | 0x4000 | 该类型具有非平凡的复制构造函数。如果未设置此标志,则可以使用 memcpy 复制实例。 |
QMetaType::NeedsMoveConstruction (since Qt 6.5) | 0x8000 | 该类型具有非平凡的移动构造函数。如果未设置该标志,则可以使用 memcpy 移动实例。 |
QMetaType::NeedsDestruction | 0x2 | 该类型具有非平凡的析构函数。如果未设置该标志,在丢弃对象之前无需调用析构函数。 |
QMetaType::RelocatableType | 0x4 | 具有此属性的类型的实例可使用 memcpy 安全地移动到另一个内存位置。 |
QMetaType::IsEnumeration | 0x10 | 该类型是一个枚举类型。 |
QMetaType::IsUnsignedEnumeration | 0x100 | 如果该类型是枚举类型,则其底层类型为无符号类型。 |
QMetaType::PointerToQObject | 0x8 | 该类型是QObject 派生类的指针。 |
QMetaType::IsPointer | 0x800 | 该类型是另一个类型的指针。 |
QMetaType::IsConst | 0x2000 | 表示该类型的值是不可变的;例如,因为它们是 const 对象的指针。 注意:在 Qt 6.5之前 ,如果复制构造函数或析构函数是非平凡的(即类型是非平凡的),则 NeedsConstruction 和 NeedsDestruction 标志都会被错误地设置。 |
请注意,尽管 Needs 标志可能已被设置,但元类型可能没有相关类型的公开构造函数或公开析构函数。
TypeFlags 类型是QFlags<TypeFlag> 的 typedef。它存储 TypeFlag 值的按“或”运算组合。
成员函数文档
[constexpr noexcept default, since 6.0] QMetaType::QMetaType()
构建一个默认的、无效的 QMetaType 对象。
该函数在 Qt 6.0 中引入。
[explicit] QMetaType::QMetaType(int typeId)
构建一个 QMetaType 对象,其中包含有关类型typeId 的所有信息。
[constexpr, 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)
如果 `QMetaType::convert ` 能够将 `fromType ` 转换为 `toType`,则返回 `true `。请注意,这主要涉及执行转换的能力,而实际转换在尝试时可能会失败(例如,将浮点数转换为超出其范围的整数)。
可以使用registerConverter() 函数来注册额外的转换,无论是内置类型与非内置类型之间的转换,还是两个非内置类型之间的转换。如果转换路径已注册,该函数将返回true 。
Qt 支持以下转换:
其他支持的转换包括所有基本类型(int 、float 、bool 等,包括所有枚举)之间的转换,以及任何指针类型与std::nullptr_t 之间的转换。枚举类型还可以转换为QString 和QByteArray 。
如果fromType 和toType 都是从QObject 派生的类型(或指向它们的指针),且其中一种类型是从另一种类型派生而来,则该函数也会返回true 。也就是说,如果从fromType 描述的类型到toType 描述的类型的static_cast<> 能够编译通过,则该函数返回 true。convert() 函数的工作原理与qobject_cast() 类似,用于验证QVariant 所指向的对象的动态类型。
如果toType 为QVariantList ,则从顺序容器进行的类型转换对该函数也会返回 true。
同样,如果toType 为QVariantHash 或QVariantMap ,则从关联容器进行类型转换时,该函数也会返回 true。
另请参阅 convert()、QMetaSequence::Iterable 、Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()、QMetaAssociation::Iterable 以及Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE()。
[static] bool QMetaType::canView(QMetaType fromType, QMetaType toType)
如果 `QMetaType::view ` 能够针对类型 `fromType` 创建类型 `toType ` 的可变视图,则返回 `true `。
如果从qobject_cast 传入的类型(由fromType 描述)到toType 描述的类型之间的转换能够成功,则该函数在QObject 派生类型的指针之间进行转换时将返回 true。
您可以在任何已通过Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE() 注册的容器上创建类型为QMetaSequence::Iterable 的可变视图。
同样,您可以在任何已通过Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE() 注册的容器上创建类型为QMetaAssociation::Iterable 的可变视图。
另请参阅 convert()、QMetaSequence::Iterable 、Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()、QMetaAssociation::Iterable 以及Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE()。
[since 6.0] QPartialOrdering QMetaType::compare(const void *lhs, const void *rhs) const
比较位于lhs 和rhs 处的对象以确定排序顺序。
如果不支持比较,或者值无序,则返回QPartialOrdering::Unordered 。否则,如果lhs 分别小于、等于或大于rhs ,则分别返回QPartialOrdering::Less 、QPartialOrdering::Equivalent 或QPartialOrdering::Greater 。
两个对象必须均为该元类型所描述的类型。若lhs 或rhs 的值为nullptr ,则这些值无序。仅当该类型的“小于”运算符在元类型声明中可见时,才支持比较操作。
如果该类型的相等运算符同样可见,则只有当相等运算符判定两个值相等时,它们才被视为相等。 在没有等号运算符的情况下,当两个值均不小于对方时,它们被视为相等;如果等号运算符可用,且这两个值不相等,则它们被视为无序,正如浮点类型的 NaN(非数值)值位于其排序范围之外一样。
注意:如果 元类型声明中未可见“小于”运算符,则即使对该声明可见的等值运算符认为两个值相等,它们仍被视为无序:compare() == 0 仅在“小于”运算符可见时才与equals() 结果一致。
该函数在 Qt 6.0 中引入。
void *QMetaType::construct(void *where, const void *copy = nullptr) const
在由where 指定的现有内存中,构建一个与该QMetaType 实例所针对的类型相符的值(即copy 的副本),并返回where 。如果copy 为零,则对该值进行默认构造。
这是一个用于显式管理该类型存储内存的底层函数。如果您不需要此级别的控制,请考虑调用create()(即使用“new”而非“placement new”)。
您必须确保where 指向可存储新值的位置,并且where 已正确对齐。可通过调用sizeOf() 查询该类型的大小。
对齐的经验法则是:类型应对其自然边界进行对齐,即大于该类型的最小 2 的幂,除非该对齐值大于该平台上的最大有效对齐值。 从实际应用角度来看,只有在涉及特殊硬件指令时(例如 x86 架构上对齐的 SSE 加载和存储指令),才需要大于 2 * sizeof(void*) 的对齐度。
[static] bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType, void *to)
将位于from 的对象从fromType 转换为位于to 的预分配空间,类型为toType 。如果转换成功,则返回true ;否则返回 false。
from 和to 都必须是有效的指针。
void *QMetaType::create(const void *copy = nullptr) const
返回copy 的副本,前提是该 的类型与该QMetaType 实例的创建类型一致。如果copy 为nullptr ,则创建一个通过默认构造函数生成的实例。
另请参阅 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() 不同,此函数仅调用该类型的析构函数,而不调用 delete 运算符。
另请参阅 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()。
[constexpr] QMetaType::TypeFlags QMetaType::flags() const
返回该QMetaType 实例所基于的类型的标志。若要检查特定的类型特征,建议使用“is-”函数之一,而非直接使用这些标志。
另请参阅 QMetaType::TypeFlags 、isDefaultConstructible()、isCopyConstructible()、isMoveConstructible()、isDestructible()、isEqualityComparable() 以及isOrdered()。
[static] QMetaType QMetaType::fromName(QByteArrayView typeName)
返回一个与typeName 匹配的QMetaType 。如果typeName未被QMetaType
[static constexpr] template <typename T> QMetaType QMetaType::fromType()
返回与模板参数中指定的类型对应的QMetaType 。
[static] bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)
true如果元类型系统中已注册了从元类型 IDfromType 到toType
[static] template <typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()
如果元类型系统中已注册了从类型 From 到类型 To 的转换,则返回true 。
这是一个重载函数。
[since 6.1] bool QMetaType::hasRegisteredDataStreamOperators() const
如果元类型系统已为此元类型注册了数据流运算符,则返回true 。
该函数于 Qt 6.1 版本中引入。
[since 6.0] bool QMetaType::hasRegisteredDebugStreamOperator() const
如果元类型系统为此元类型注册了调试流运算符,则返回true 。
该函数在 Qt 6.0 中引入。
[static] bool QMetaType::hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)
如果元类型系统在元类型 IDfromType 上注册了元类型 IDtoType 的可变视图,则返回true 。
[static, since 6.0] template <typename From, typename To> bool QMetaType::hasRegisteredMutableViewFunction()
如果元类型系统在类型 To 上注册了类型 From 的可变视图,则返回true 。
这是一个重载函数。
该函数在 Qt 6.0 中引入。
int QMetaType::id() const
返回此QMetaType 实例持有的id类型。
[noexcept, since 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。如果可以,那么在调用 `construct()` 和 `create()` 时,可以将 `copy ` 参数设为 null。
该函数在 Qt 6.5 中引入。
另请参阅 flags()、isCopyConstructible()、isMoveConstructible() 和isDestructible()。
[noexcept, since 6.5] bool QMetaType::isDestructible() const
如果该类型可以被销毁,则返回 true。如果可以,则可以调用destroy() 和destruct()。
该函数在 Qt 6.5 中引入。
另请参阅 flags()、isDefaultConstructible()、isCopyConstructible() 和isMoveConstructible()。
bool QMetaType::isEqualityComparable() const
如果该元类型所描述的类型具有小于或等于运算符,且该运算符在元类型声明中是可见的,则返回true ;否则返回false 。
[noexcept, since 6.5] bool QMetaType::isMoveConstructible() const
如果该类型支持移动构造,则返回 true。QMetaType 目前尚无利用此特性的 API。
该函数于 Qt 6.5 中引入。
另请参阅 flags()、isDefaultConstructible()、isCopyConstructible() 以及isDestructible()。
bool QMetaType::isOrdered() const
如果该元类型所描述的类型具有小于运算符,且该运算符在元类型声明中是可见的,则返回true ;否则返回false 。
另请参阅 compare() 和isEqualityComparable()。
[noexcept] bool QMetaType::isRegistered() const
如果该QMetaType 对象已在 Qt 全局元类型注册表中注册,则返回true 。注册后,可通过名称(使用QMetaType::fromName()) 或 ID(使用构造函数)查找该类型。
另请参阅 qRegisterMetaType() 和isValid()。
[static] bool QMetaType::isRegistered(int type)
如果 ID 为type 的数据类型已注册,则返回true ;否则返回false 。
[constexpr noexcept] bool QMetaType::isValid() const
如果该QMetaType 对象包含有关某类型的有效信息,则返回true ;否则返回 false。
另请参阅 isRegistered()。
bool QMetaType::load(QDataStream &stream, void *data) const
从给定的stream 中读取此类型的对象,并将其读入data 。如果对象加载成功,则返回true ;否则返回false 。
通常情况下,您无需直接调用此函数。建议使用QVariant 的operator>>() 方法,该方法依赖于load()来加载自定义类型。
另请参阅 save()。
[constexpr] const QMetaObject *QMetaType::metaObject() const
返回一个相对于此类型的QMetaObject 。
如果该类型是QObject 子类的指针类型,则flags()包含QMetaType::PointerToQObject ,且本函数返回相应的QMetaObject 。这可与QMetaObject::newInstance()结合使用,以创建该类型的QObject。
如果类型是Q_GADGET ,则flags()包含QMetaType::IsGadget 。如果类型是Q_GADGET 的指针,则flags()包含QMetaType::PointerToGadget 。在这两种情况下,该函数均返回其QMetaObject 。这可用于检索QMetaMethod 和QMetaProperty ,并将其应用于该类型的指针上,例如由QVariant::data()返回的指针。
如果类型是一个枚举,则flags() 包含QMetaType::IsEnumeration 。在这种情况下,如果该枚举已注册为Q_ENUM ,则该函数返回外围对象的QMetaObject ;否则返回nullptr 。
另请参阅 QMetaType::flags()。
[constexpr] const char *QMetaType::name() const
返回与该QMetaType 关联的类型名称;如果未找到匹配的类型,则返回空指针。返回的指针不得被删除。
另请参阅 typeName()。
[static] template <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] template <typename From, typename To> bool QMetaType::registerConverter(To (From::*function)() const)
在元类型系统中,将方法function (形式为To From::function() const)注册为从类型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] template <typename From, typename To> bool QMetaType::registerConverter(To (From::*function)(bool *) const)
在元类型系统中将方法function (如 To From::function(bool *ok) const)注册为从类型 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] template <
typename From,
typename To,
typename UnaryFunction
>
bool QMetaType::registerConverter(UnaryFunction function)
在元类型系统中将一元函数对象 `function ` 注册为从类型 `From` 到类型 `To` 的转换器。如果注册成功,则返回 `true `;否则返回 `false`。
function 该函数必须接受类型From 的实例,并返回类型To 的实例。它可以是函数指针、lambda 表达式或函子对象。自 Qt 6.5 起,function 还可以返回类型std::optional<To> 的实例,以便指示转换失败的情况。
QMetaType::registerConverter<CustomStringType, QString>([](const CustomStringType &str) {
return QString::fromUtf8(str.data());
});
QMetaType::registerConverter<QJsonValue, CustomPointType>(
[](const QJsonValue &value) -> std::optional<CustomPointType> {
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 CustomPointType{object["x"].toDouble(), object["y"].toDouble()};
});这是一个重载函数。
[static, since 6.0] template <typename From, typename To> bool QMetaType::registerMutableView(To (From::*function)())
在元类型系统中,将方法function (如To From::function() 所示)注册为类型From 上类型To 的可变视图。如果注册成功,则返回true ;否则返回false 。
这是一个重载函数。
该函数在 Qt 6.0 中引入。
[static, since 6.0] template <
typename From,
typename To,
typename UnaryFunction
>
bool QMetaType::registerMutableView(UnaryFunction function)
在元类型系统中,将一元函数对象function 注册为类型From上类型To的可变视图。如果注册成功,则返回true ;否则返回false 。
这是一个重载函数。
该函数于 Qt 6.0 中引入。
[since 6.5] void QMetaType::registerType() const
将此QMetaType 注册到类型注册表中,以便可以通过名称查找它,使用QMetaType::fromName()。
该函数在 Qt 6.5 中引入。
另请参阅 qRegisterMetaType()。
bool QMetaType::save(QDataStream &stream, const void *data) const
将data 所指向的对象写入指定的stream 。如果对象保存成功,则返回true ;否则返回false 。
通常情况下,您无需直接调用此函数。建议使用QVariant 的operator<<() 方法,该方法依赖于 save() 来流式传输自定义类型。
另请参阅 load()。
[constexpr] qsizetype QMetaType::sizeOf() const
返回该类型的字节大小(即 sizeof(T),其中 T 是该QMetaType 实例所构造的实际类型)。
该函数通常与 `construct()` 配合使用,以对类型所占用的内存进行低级管理。
另请参阅 QMetaType::construct() 和QMetaType::alignOf()。
[since 6.6] QMetaType QMetaType::underlyingType() const
如果该元类型表示一个枚举,则该方法返回一个数值类的元类型,其符号性和大小与该枚举的底层类型相同。如果它表示一个QFlags 类型,则返回QMetaType::Int 。在所有其他情况下,将返回一个无效的QMetaType 。
该函数在 Qt 6.6 中引入。
[static, since 6.0] bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)
在预分配空间to (类型为toType )中,针对位于from 的对象fromType 创建一个可变视图。如果转换成功,则返回true ,否则返回 false。
该函数自 Qt 6.0 起引入。
相关的非成员函数
[since 6.4] size_t qHash(QMetaType key, size_t seed = 0)
返回key 的哈希值,并使用seed 作为计算的种子。
该函数于 Qt 6.4 中引入。
[constexpr] template <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 declaredQMetaType::type() 返回的 ID 与 qMetaTypeId() 相同,但会在运行时根据类型的名称进行查找。QMetaType::type() 的执行速度稍慢,但如果类型未注册,编译仍会成功。
另请参阅 Q_DECLARE_METATYPE() 和QMetaType::type()。
[constexpr] template <typename T> int qRegisterMetaType()
调用此函数以注册类型T 。返回元类型Id。
示例:
int id = qRegisterMetaType<MyStruct>();该函数要求在调用时,T 必须是一个完全定义的类型。对于指针类型,还要求其所指向的类型已完全定义。若要注册指向前置声明类型的指针,请使用Q_DECLARE_OPAQUE_POINTER()。
若要在 `QMetaType`、`QVariant` 或 `QObject::property()` API 中使用类型 `T `,则无需进行注册。
若要在队列式信号与槽连接中使用类型T ,必须在建立第一个连接之前调用qRegisterMetaType<T>() 。这通常在使用T 的类构造函数中完成,或在main() 函数中完成。
类型注册后,可通过其名称使用QMetaType::fromName() 进行查找。
另请参阅 Q_DECLARE_METATYPE()。
[since 6.5] int qRegisterMetaType(QMetaType meta)
注册元类型meta 并返回其类型 ID。
要在队列式信号和插槽连接中使用具有元类型meta 的类型,必须在建立第一个连接之前调用qRegisterMetaType(meta) 。这通常在使用该元类型的类的构造函数中完成,或在main() 函数中完成。
类型注册后,可通过QMetaType::fromName() 按名称查找该类型。
该函数于 Qt 6.5 中引入。
[noexcept] bool operator!=(const QMetaType &lhs, const QMetaType &rhs)
如果QMetaType (lhs )表示的类型与QMetaType (rhs )不同,则返回true ;否则返回false 。
[since 6.5] QDebug operator<<(QDebug d, QMetaType m)
将QMetaType m 写入流d ,并返回该流。
该函数在 Qt 6.5 中引入。
[noexcept] bool operator==(const QMetaType &lhs, const QMetaType &rhs)
宏文档
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(Container)
该宏使容器Container 被QMetaType 识别为关联容器。这样,如果T和U本身被QMetaType 识别,就可以将Container<T, U>的实例放入QVariant 中。
请注意,所有 Qt 关联容器都已内置支持,因此无需对它们使用此宏。std::map 容器也内置了支持。
以下示例展示了 Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE() 的典型用法:
#include <unordered_map>
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(std::unordered_map)
void someFunction()
{
std::unordered_map<int, bool> container;
QVariant var = QVariant::fromValue(container);
// ...
}Q_DECLARE_METATYPE(Type)
只要类型Type 提供了公共默认构造函数、公共复制构造函数和公共析构函数,此宏就会使QMetaType 识别该类型。若要在QVariant 中将类型Type 用作自定义类型,则需要此宏。
该宏要求在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
{
struct MyStruct
{
//...
};
}
Q_DECLARE_METATYPE(MyNamespace::MyStruct)由于QMetaType 现在已知MyStruct ,因此可以在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> 或 std::pair<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()。
Q_DECLARE_OPAQUE_POINTER(PointerType)
该宏允许将指向前向声明类型(PointerType )的指针,通过Q_DECLARE_METATYPE() 或qRegisterMetaType() 注册到QMetaType 中。
请勿使用此宏来规避moc因属性类型不完整而报出的警告或错误——当被指针指向的类型在程序的其他上下文中作为完整类型使用时。若类型的完整定义已可用,但您希望在头文件中使用前向声明以缩短编译时间,请改用Q_MOC_INCLUDE 。
警告:请勿将 Q_DECLARE_OPAQUE_POINTER 用于指向Q_OBJECT 或 gadget 类的指针,因为这可能会导致元类型系统中的信息不一致。
另请参阅 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 中。
请注意,QWeakPointer 、QSharedPointer 和QPointer 本身已内置支持,因此无需与这些类型配合使用此宏。
以下示例展示了 Q_DECLARE_SMART_POINTER_METATYPE() 的典型用法:
#include <memory>
Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr)
voidsomeMethod()
{
autosmart_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'.
}
}© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.