diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-06-17 14:02:29 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-06-17 15:35:30 -0300 |
commit | 6b70a1362ccfd140617c610e52f2abbbbe08afc4 (patch) | |
tree | daf6f73ca5f853437500504db727995b26e994ea /libpyside | |
parent | d699a3abedfe60e7146fad8381b03687ce476699 (diff) |
Fixed signal connection with native slot.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/signalmanager.cpp | 41 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 2 |
2 files changed, 29 insertions, 14 deletions
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 |