diff options
author | Stephen Kelly <stephen.kelly@kdab.com> | 2012-08-18 13:05:16 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-28 18:30:39 +0200 |
commit | a912b14c755137ed5529854027b9ab3f7e06c5e9 (patch) | |
tree | 8593866f1a795d6a3168473e75a56bcb74c920cb /src/corelib | |
parent | 62c2061a501563e7f2929c5883f01955af0f2fc1 (diff) |
Add automatic metatype registration for invokable methods.
This works similarly to the automatic registration for Q_PROPERTY types,
but in this case it mostly affects the need for users to
call qRegisterMetaType<T>() before using queued connections
with methods using non-built-in metatypes, or before using invokeMethod
manually.
Change-Id: Ib17d0606b77b0130624b6a88b57c36d26e97d12d
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 33 | ||||
-rw-r--r-- | src/corelib/kernel/qobjectdefs.h | 3 |
2 files changed, 26 insertions, 10 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index ac30b0dde1..a2da42d73e 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1778,7 +1778,16 @@ int QMetaMethod::parameterType(int index) const return QMetaType::UnknownType; if (index >= QMetaMethodPrivate::get(this)->parameterCount()) return QMetaType::UnknownType; - return QMetaMethodPrivate::get(this)->parameterType(index); + + int type = QMetaMethodPrivate::get(this)->parameterType(index); + if (type != QMetaType::UnknownType) + return type; + + void *argv[] = { &type, &index }; + mobj->static_metacall(QMetaObject::RegisterMethodArgumentMetaType, QMetaMethodPrivate::get(this)->ownMethodIndex(), argv); + if (type != -1) + return type; + return QMetaType::UnknownType; } /*! @@ -2160,15 +2169,21 @@ bool QMetaMethod::invoke(QObject *object, args[i] = QMetaType::create(types[i], param[i]); ++nargs; } else if (param[i]) { - qWarning("QMetaMethod::invoke: Unable to handle unregistered datatype '%s'", - typeNames[i]); - for (int x = 1; x < i; ++x) { - if (types[x] && args[x]) - QMetaType::destroy(types[x], args[x]); + // Try to register the type and try again before reporting an error. + void *argv[] = { &types[i], &i }; + QMetaObject::metacall(object, QMetaObject::RegisterMethodArgumentMetaType, + idx_relative + idx_offset, argv); + if (types[i] == -1) { + qWarning("QMetaMethod::invoke: Unable to handle unregistered datatype '%s'", + typeNames[i]); + for (int x = 1; x < i; ++x) { + if (types[x] && args[x]) + QMetaType::destroy(types[x], args[x]); + } + free(types); + free(args); + return false; } - free(types); - free(args); - return false; } } diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index 0ed35a2faf..00eead5d2f 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -438,7 +438,8 @@ struct Q_CORE_EXPORT QMetaObject QueryPropertyUser, CreateInstance, IndexOfMethod, - RegisterPropertyMetaType + RegisterPropertyMetaType, + RegisterMethodArgumentMetaType }; int static_metacall(Call, int, void **) const; |