diff options
-rw-r--r-- | libpyside/qsignal.cpp | 8 | ||||
-rw-r--r-- | libpyside/signalmanager.cpp | 13 | ||||
-rw-r--r-- | tests/signals/signal_object_test.py | 13 |
3 files changed, 26 insertions, 8 deletions
diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 1edc13c04..43c02f1cd 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -246,7 +246,12 @@ char* signal_get_type_name(PyObject* type) if (PyType_Check(type)) { //tp_name return the full name Shiboken::AutoDecRef typeName(PyObject_GetAttrString(type, "__name__")); - return strdup(PyString_AS_STRING(typeName.object())); + char *aux = strdup(PyString_AS_STRING(typeName.object())); + if (Shiboken::TypeResolver::getType(aux) == Shiboken::TypeResolver::ObjectType) { + aux = reinterpret_cast<char*>(realloc(aux, strlen(aux) + 1)); + aux = strcat(aux, "*"); + } + return aux; } else if (PyString_Check(type)) { return strdup(PyString_AS_STRING(type)); } @@ -281,7 +286,6 @@ char* signal_parse_signature(PyObject *args) } } } - return signature; } diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 7ac3f3067..6ea05c918 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -253,7 +253,12 @@ static bool emitNormalSignal(QObject* source, int signalIndex, const char* signa for (i = 0; i < argsGiven; ++i) { Shiboken::TypeResolver* typeResolver = Shiboken::TypeResolver::get(qPrintable(argTypes[i])); if (typeResolver) { - signalArgs[i+1] = typeResolver->toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i)); + void *data = typeResolver->toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i)); + if (Shiboken::TypeResolver::getType(qPrintable(argTypes[i])) == Shiboken::TypeResolver::ObjectType) { + signalArgs[i+1] = &data; + } else { + signalArgs[i+1] = data; + } } else { PyErr_Format(PyExc_TypeError, "Unknown type used to emit a signal: %s", qPrintable(argTypes[i])); break; @@ -289,7 +294,6 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar else return emitNormalSignal(source, signalIndex, signal, args, argTypes); } - qDebug() << "Signal" << signal << "not found, probably a typo or you are emitting a dynamic signal that has never been used in a connection until now."; return false; } @@ -316,7 +320,10 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count())); for (int i = 0, max = paramTypes.count(); i < max; ++i) { - PyObject* arg = Shiboken::TypeResolver::get(paramTypes[i].constData())->toPython(args[i+1]); + void* data = args[i+1]; + const char* dataType = paramTypes[i].constData(); + + PyObject* arg = Shiboken::TypeResolver::get(dataType)->toPython(data); PyTuple_SET_ITEM(preparedArgs.object(), i, arg); } diff --git a/tests/signals/signal_object_test.py b/tests/signals/signal_object_test.py index d36665cf6..1b1f2222a 100644 --- a/tests/signals/signal_object_test.py +++ b/tests/signals/signal_object_test.py @@ -13,7 +13,7 @@ class MyObject(QTimer): sig3 = Signal(int) sig4 = Signal((int,), (unicode,)) sig5 = Signal((unicode,), (int,)) - + sig6 = Signal(QObject) @Slot(int) def myRange(self, r): @@ -25,6 +25,9 @@ class MyObject(QTimer): def slotString(self, s): self._s = s + def slotObject(self, o): + self._o = o + class SignalObjectTest(UsesQCoreApplication): def cb(self): @@ -75,8 +78,12 @@ class SignalObjectTest(UsesQCoreApplication): o.sig5[int].emit(10) self.assertEqual(o._range, 10) - - + def testSignalWithObject(self): + o = MyObject() + o.sig6.connect(o.slotObject) + arg = QObject() + o.sig6.emit(arg) + self.assertEqual(arg, o._o) if __name__ == '__main__': unittest.main() |