diff options
-rw-r--r-- | PySide/QtCore/glue/qobject_connect.cpp | 4 | ||||
-rw-r--r-- | libpyside/signalmanager.cpp | 41 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 2 |
3 files changed, 31 insertions, 16 deletions
diff --git a/PySide/QtCore/glue/qobject_connect.cpp b/PySide/QtCore/glue/qobject_connect.cpp index 5b6f2547d..e9de41144 100644 --- a/PySide/QtCore/glue/qobject_connect.cpp +++ b/PySide/QtCore/glue/qobject_connect.cpp @@ -56,7 +56,7 @@ static bool qobjectConnectCallback(QObject* source, const char* signal, PyObject return false; const QMetaObject* metaObject = receiver->metaObject(); - const QByteArray callbackSig = PySide::getCallbackSignature(signal, callback, usingGlobalReceiver).toAscii(); + const QByteArray callbackSig = PySide::getCallbackSignature(signal, receiver, callback, usingGlobalReceiver).toAscii(); const char* slot = callbackSig.constData(); int slotIndex = metaObject->indexOfSlot(slot); if (slotIndex == -1) { @@ -103,7 +103,7 @@ static bool qobjectDisconnectCallback(QObject* source, const char* signal, PyObj return false; const QMetaObject* metaObject = receiver->metaObject(); - const QByteArray callbackSig = PySide::getCallbackSignature(signal, callback, usingGlobalReceiver).toAscii(); + const QByteArray callbackSig = PySide::getCallbackSignature(signal, receiver, callback, usingGlobalReceiver).toAscii(); QByteArray qtSlotName(callbackSig); qtSlotName = qtSlotName.prepend('1'); diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 6ea05c918..d44743cc7 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -104,12 +104,13 @@ static QString codeCallbackName(PyObject* callback, const QString& funcName) return funcName+QString::number(quint64(callback), 16); } -QString PySide::getCallbackSignature(const char* signal, PyObject* callback, bool encodeName) +QString PySide::getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName) { QString functionName; + QString signature; + QStringList args; int numArgs = -1; bool useSelf = false; - bool isMethod = PyMethod_Check(callback); bool isFunction = PyFunction_Check(callback); @@ -123,25 +124,41 @@ QString PySide::getCallbackSignature(const char* signal, PyObject* callback, boo functionName = ((PyCFunctionObject*)callback)->m_ml->ml_name; useSelf = ((PyCFunctionObject*)callback)->m_self; int flags = ((PyCFunctionObject*)callback)->m_ml->ml_flags; - if (flags & METH_O) - numArgs = 1; - else if (flags & METH_VARARGS) - numArgs = -1; - else if (flags & METH_NOARGS) - numArgs = 0; + + if (receiver) { + //Search for signature on metaobject + const QMetaObject *mo = receiver->metaObject(); + for(int i=0; i < mo->methodCount(); i++) { + QMetaMethod me = mo->method(i); + if (QString(me.signature()).startsWith(functionName)) { + numArgs = me.parameterTypes().size()+1; + break; + } + } + } + + if (numArgs == -1) { + if (flags & METH_O) + numArgs = 1; + else if (flags & METH_VARARGS) + numArgs = -1; + else if (flags & METH_NOARGS) + numArgs = 0; + } } else if (PyCallable_Check(callback)) { functionName = "__callback"+QString::number((size_t)callback); } + Q_ASSERT(!functionName.isEmpty()); - QString signature; + bool isShortCircuit = false; + if (encodeName) signature = codeCallbackName(callback, functionName); else signature = functionName; - bool isShortCircuit; - QStringList args = getArgsFromSignature(signal, &isShortCircuit); + args = getArgsFromSignature(signal, &isShortCircuit); if (!isShortCircuit) { signature.append('('); @@ -313,10 +330,8 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, } else { // call python slot Shiboken::GilState gil; - QList<QByteArray> paramTypes = method.parameterTypes(); PyObject* self = Shiboken::BindingManager::instance().retrieveWrapper(object); - Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count())); for (int i = 0, max = paramTypes.count(); i < max; ++i) { diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 9687dcc3e..70d7f0895 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -59,7 +59,7 @@ private: PYSIDE_API bool isSignal(const char* signal); PYSIDE_API bool checkSignal(const char* signal); -PYSIDE_API QString getCallbackSignature(const char* signal, PyObject* callback, bool encodeName); +PYSIDE_API QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName); QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit = 0); class PYSIDE_API SignalManager |