From 43ec6577661dd468ba8f6c841b3fe90537a951eb Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Wed, 26 May 2010 16:42:13 -0300 Subject: Fixed bug on dynamic metaobject creation. Reviewer: Luciano Wolf , Marcelo Lira --- libpyside/dynamicqmetaobject.cpp | 9 +++++++-- libpyside/qsignal.cpp | 30 ++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-) (limited to 'libpyside') diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index d4e3ca255..562f2d476 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -153,6 +153,7 @@ void DynamicQMetaObject::addSlot(const char* slot, const char* type) if (i != m_slots.end()) return; + //search for a empty space MethodData blank; i = qFind(m_slots.begin(), m_slots.end(), blank); @@ -193,7 +194,9 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject* pyObj, PyTypeObj PyObject *attr = PyObject_GetAttr(pyObj, key); SignalInstanceData *data = reinterpret_cast(attr); while(data) { - mo->addSignal(data->signature); + int index = base->indexOfSignal(data->signature); + if (index == -1) + mo->addSignal(data->signature); data = reinterpret_cast(data->next); } } @@ -209,7 +212,9 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject* pyObj, PyTypeObj QString sig(PyString_AsString(signature)); //slot the slot type and signature QStringList slotInfo = sig.split(" ", QString::SkipEmptyParts); - mo->addSlot(slotInfo[1].toAscii(), slotInfo[0].toAscii()); + int index = base->indexOfSlot(slotInfo[0].toAscii()); + if (index == -1) + mo->addSlot(slotInfo[1].toAscii(), slotInfo[0].toAscii()); } } } diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 159d8c2d0..56ccde587 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -40,6 +40,7 @@ #include "signalmanager.h" #define SIGNAL_CLASS_NAME "signal" +#define QT_SIGNAL_SENTINEL "2" namespace PySide { @@ -71,6 +72,7 @@ static char* signal_get_type_name(PyObject*); static void signal_append_signature(SignalData*, char*); static void signal_instance_initialize(PyObject*, PyObject*, SignalData*, PyObject *, int); static char* signal_parse_signature(PyObject*); +static PyObject* signal_build_qt_compatible(const char*); PyTypeObject Signal_Type = { PyObject_HEAD_INIT(0) @@ -254,7 +256,7 @@ char* signal_get_type_name(PyObject* type) char* signal_build_signature(const char *name, const char *signature) { QString signal; - signal.sprintf("2%s(%s)", name, signature); + signal.sprintf("%s(%s)", name, signature); return strdup(QMetaObject::normalizedSignature(signal.toAscii())); } @@ -404,12 +406,13 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds while(targetWalk && !match) { if (QMetaObject::checkConnectArgs(sourceWalk->signature, targetWalk->signature)) { PyList_Append(pyArgs, sourceWalk->source); - Shiboken::AutoDecRef sourceSignature(PyString_FromString(sourceWalk->signature)); + Shiboken::AutoDecRef sourceSignature(signal_build_qt_compatible(sourceWalk->signature)); PyList_Append(pyArgs, sourceSignature); PyList_Append(pyArgs, targetWalk->source); - Shiboken::AutoDecRef targetSignature(PyString_FromString(targetWalk->signature)); + Shiboken::AutoDecRef targetSignature(signal_build_qt_compatible(targetWalk->signature)); PyList_Append(pyArgs, targetSignature); + match = true; } targetWalk = reinterpret_cast(targetWalk->next); @@ -419,7 +422,7 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds } else { //try the first signature PyList_Append(pyArgs, source->source); - Shiboken::AutoDecRef signature(PyString_FromString(source->signature)); + Shiboken::AutoDecRef signature(signal_build_qt_compatible(source->signature)); PyList_Append(pyArgs, signature); PyList_Append(pyArgs, slot); @@ -454,18 +457,18 @@ PyObject* signal_instance_disconnect(PyObject* self, PyObject* args) SignalInstanceData *target = reinterpret_cast(slot); if (QMetaObject::checkConnectArgs(source->signature, target->signature)) { PyList_Append(pyArgs, source->source); - Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature)); + Shiboken::AutoDecRef source_signature(signal_build_qt_compatible(source->signature)); PyList_Append(pyArgs, source_signature); PyList_Append(pyArgs, target->source); - Shiboken::AutoDecRef target_signature(PyString_FromString(target->signature)); + Shiboken::AutoDecRef target_signature(signal_build_qt_compatible(target->signature)); PyList_Append(pyArgs, target_signature); match = true; } } else { //try the first signature PyList_Append(pyArgs, source->source); - Shiboken::AutoDecRef signature(PyString_FromString(source->signature)); + Shiboken::AutoDecRef signature(signal_build_qt_compatible(source->signature)); PyList_Append(pyArgs, signature); PyList_Append(pyArgs, slot); @@ -486,7 +489,7 @@ PyObject* signal_instance_emit(PyObject* self, PyObject* args) SignalInstanceData *source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); - Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature)); + Shiboken::AutoDecRef source_signature(signal_build_qt_compatible(source->signature)); PyList_Append(pyArgs, source_signature); for(Py_ssize_t i=0, i_max=PyTuple_Size(args); i < i_max; i++) @@ -522,4 +525,15 @@ PyObject* signalNew(const char* name, ...) } +PyObject* signal_build_qt_compatible(const char* signature) +{ + char* qtSignature; + qtSignature = reinterpret_cast(malloc(strlen(signature)+2)); + sprintf(qtSignature, QT_SIGNAL_SENTINEL"%s", signature); + PyObject* ret = PyString_FromString(qtSignature); + free(qtSignature); + return ret; +} + + } //namespace PySide -- cgit v1.2.3