aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-06-17 14:02:29 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-06-17 15:35:30 -0300
commit6b70a1362ccfd140617c610e52f2abbbbe08afc4 (patch)
treedaf6f73ca5f853437500504db727995b26e994ea /libpyside
parentd699a3abedfe60e7146fad8381b03687ce476699 (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.cpp41
-rw-r--r--libpyside/signalmanager.h2
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