summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorStephen Kelly <stephen.kelly@kdab.com>2012-08-18 13:05:16 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-28 18:30:39 +0200
commita912b14c755137ed5529854027b9ab3f7e06c5e9 (patch)
tree8593866f1a795d6a3168473e75a56bcb74c920cb /src/corelib
parent62c2061a501563e7f2929c5883f01955af0f2fc1 (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.cpp33
-rw-r--r--src/corelib/kernel/qobjectdefs.h3
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;