diff options
-rw-r--r-- | libpyside/qsignal.cpp | 32 | ||||
-rw-r--r-- | tests/signals/signal_object_test.py | 10 |
2 files changed, 30 insertions, 12 deletions
diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 7cfa9f99d..0d24bec40 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -361,18 +361,26 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds bool match = false; if (slot->ob_type == &SignalInstance_Type) { - //TODO: find best match - SignalInstanceData *target = reinterpret_cast<SignalInstanceData*>(slot); - - if (QMetaObject::checkConnectArgs(source->signature, target->signature)) { - PyList_Append(pyArgs, source->source); - Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature)); - PyList_Append(pyArgs, source_signature); - - PyList_Append(pyArgs, target->source); - Shiboken::AutoDecRef target_signature(PyString_FromString(target->signature)); - PyList_Append(pyArgs, target_signature); - match = true; + SignalInstanceData *sourceWalk = source; + SignalInstanceData *targetWalk; + + //find best match + while(sourceWalk && !match) { + targetWalk = reinterpret_cast<SignalInstanceData*>(slot); + while(targetWalk && !match) { + if (QMetaObject::checkConnectArgs(sourceWalk->signature, targetWalk->signature)) { + PyList_Append(pyArgs, sourceWalk->source); + Shiboken::AutoDecRef sourceSignature(PyString_FromString(sourceWalk->signature)); + PyList_Append(pyArgs, sourceSignature); + + PyList_Append(pyArgs, targetWalk->source); + Shiboken::AutoDecRef targetSignature(PyString_FromString(targetWalk->signature)); + PyList_Append(pyArgs, targetSignature); + match = true; + } + targetWalk = reinterpret_cast<SignalInstanceData*>(targetWalk->next); + } + sourceWalk = reinterpret_cast<SignalInstanceData*>(sourceWalk->next); } } else { //try the first signature diff --git a/tests/signals/signal_object_test.py b/tests/signals/signal_object_test.py index 29c6be018..614c0e602 100644 --- a/tests/signals/signal_object_test.py +++ b/tests/signals/signal_object_test.py @@ -12,6 +12,7 @@ class MyObject(QTimer): sig2 = Signal(int, name='rangeChanged') sig3 = Signal(int) sig4 = Signal((int,), (QString,)) + sig5 = Signal((QString,), (int,)) @Slot(int) @@ -67,6 +68,15 @@ class SignalObjectTest(UsesQCoreApplication): self.app.exec_() self.assert_(self._cb_called) + def testSignalWithSignal(self): + o = MyObject() + o.sig2.connect(o.myRange) + print "sig->sig", o.sig5.connect(o.sig2) + o.sig5[int].emit(10) + self.assertEqual(o._range, 10) + + + if __name__ == '__main__': unittest.main() |