diff options
author | Stephen Kelly <stephen.kelly@kdab.com> | 2012-08-16 02:19:56 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-28 18:30:32 +0200 |
commit | 62c2061a501563e7f2929c5883f01955af0f2fc1 (patch) | |
tree | 2a9b5d5a23496c565be38059dbfc7fe42dd92f89 /src/corelib/kernel/qmetaobject.cpp | |
parent | f29896840ce9e93fde9e7c61b922ef71fa0c5590 (diff) |
Add automatic metatype registration for Q_PROPERTY types.
In Qt 4, the user needs to call qRegisterMetaType if the property
could otherwise be read before the type is registered with the metatype
system. This patch makes that unnecessary and automatic by registering
it when the first read indicates that it is not yet registered instead
or when QMetaProperty::userType is called before it is registered.
The types which are automatically registered exclude the built-in
types, which do not need to be registered, and include metatypes which
are automatically declared, such as pointers to QObject derived types
and containers of existing metatypes.
Change-Id: I0a06d8efdcb64121618e2378366d0142fa0771f5
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index e76efc35da..ac30b0dde1 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -2661,7 +2661,14 @@ int QMetaProperty::userType() const return QVariant::Int; // Match behavior of QMetaType::type() return enumMetaTypeId; } - return QMetaType::type(typeName()); + type = QMetaType::type(typeName()); + if (type != QMetaType::UnknownType) + return type; + void *argv[] = { &type }; + mobj->static_metacall(QMetaObject::RegisterPropertyMetaType, idx, argv); + if (type != -1) + return type; + return QMetaType::UnknownType; } /*! @@ -2768,8 +2775,16 @@ QVariant QMetaProperty::read(const QObject *object) const t = QMetaType::type(typeName); } if (t == QMetaType::UnknownType) { - qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name()); - return QVariant(); + // Try to register the type and try again before reporting an error. + int registerResult = -1; + void *argv[] = { ®isterResult }; + QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::RegisterPropertyMetaType, + idx + mobj->propertyOffset(), argv); + if (registerResult == -1) { + qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name()); + return QVariant(); + } + t = registerResult; } } |