- int numParams = argTypes(receiver, methodId).count();
- QGenericArgument args[9];
- for(int i = 0; i < numParams; i++)
- args[i] = QGenericArgument(params[i].typeName(), params[i].constData());
- return QMetaObject::invokeMethod(receiver, methodName(receiver, methodId), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
+ const QList<int> args = argTypes(receiver, methodId);
+ const int numArgs = params.count() < args.count()
+ ? params.count()
+ : args.count();
+
+ if(minArgCount(receiver, methodId) > params.count()) {
+ qWarning() << "SignalProxy::invokeSlot(): not enough params to invoke" << methodName(receiver, methodId);
+ return false;
+ }
+
+ void *_a[] = {0, // return type
+ 0, 0, 0, 0 , 0, // and 10 args - that's the max size qt can handle with signals and slots
+ 0, 0, 0, 0 , 0};
+ // check for argument compatibility and build params array
+ for(int i = 0; i < numArgs; i++) {
+ if(!params[i].isValid()) {
+ qWarning() << "SignalProxy::invokeSlot(): received invalid data for argument number" << i << "of method" << QString("%1::%2()").arg(receiver->metaObject()->className()).arg(receiver->metaObject()->method(methodId).signature());
+ qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
+ return false;
+ }
+ if(args[i] != QMetaType::type(params[i].typeName())) {
+ qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << methodName(receiver, methodId);
+ return false;
+ }
+ _a[i+1] = const_cast<void *>(params[i].constData());
+ }
+
+
+ Qt::ConnectionType type = QThread::currentThread() == receiver->thread()
+ ? Qt::DirectConnection
+ : Qt::QueuedConnection;
+
+ if (type == Qt::DirectConnection) {
+ return receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0;
+ } else {
+ qWarning() << "Queued Connections are not implemented yet";
+ // not to self: qmetaobject.cpp:990 ff
+ return false;
+ }
+