From 3595badad674572714ad89f60d39b454729c8d35 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Fri, 3 Jun 2011 11:32:47 -0300 Subject: Fixed signal connection with native c++ slot. Fixes bug #860. Reviewer: Luciano Wolf Hugo Parente --- libpyside/pysidesignal.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'libpyside') diff --git a/libpyside/pysidesignal.cpp b/libpyside/pysidesignal.cpp index 763456a11..0b2ad318f 100644 --- a/libpyside/pysidesignal.cpp +++ b/libpyside/pysidesignal.cpp @@ -727,8 +727,8 @@ QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit) QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName) { - QString functionName; - QString signature; + QByteArray functionName; + QByteArray signature; QStringList args; int numArgs = -1; bool useSelf = false; @@ -743,31 +743,32 @@ QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* ca numArgs = objCode->co_flags & CO_VARARGS ? -1 : objCode->co_argcount; } else if (PyCFunction_Check(callback)) { functionName = ((PyCFunctionObject*)callback)->m_ml->ml_name; - useSelf = 0;//((PyCFunctionObject*)callback)->m_self; // commented out to fix bug 736 + useSelf = ((PyCFunctionObject*)callback)->m_self; int flags = ((PyCFunctionObject*)callback)->m_ml->ml_flags; if (receiver) { //Search for signature on metaobject const QMetaObject *mo = receiver->metaObject(); + QByteArray prefix(functionName); + prefix += '('; for(int i=0; i < mo->methodCount(); i++) { - QMetaMethod me = mo->method(i); - if (QString(me.signature()).startsWith(functionName)) { - numArgs = me.parameterTypes().size()+1; + QMetaMethod me = mo->method(i); + if ((strncmp(me.signature(), prefix, prefix.size()) == 0) && + QMetaObject::checkConnectArgs(signal, me.signature())) { + numArgs = me.parameterTypes().size() + useSelf; break; } } } if (numArgs == -1) { - if (flags & METH_O) - numArgs = 1; - else if (flags & METH_VARARGS) + 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); + functionName = "__callback"+QByteArray::number((qlonglong)callback); } Q_ASSERT(!functionName.isEmpty()); @@ -775,7 +776,7 @@ QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* ca bool isShortCircuit = false; if (encodeName) - signature = codeCallbackName(callback, functionName); + signature = qPrintable(codeCallbackName(callback, functionName)); else signature = functionName; @@ -785,7 +786,7 @@ QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* ca signature.append('('); if (numArgs == -1) numArgs = std::numeric_limits::max(); - while (args.count() && args.count() > numArgs - useSelf) { + while (args.count() && (args.count() > (numArgs - useSelf))) { args.removeLast(); } signature.append(args.join(",")); -- cgit v1.2.3