aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libpyside/qsignal.cpp8
-rw-r--r--libpyside/signalmanager.cpp13
-rw-r--r--tests/signals/signal_object_test.py13
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()