Fix bug 941 - "Signals with QtCore.Qt types as arguments has invalid signatures"

Reviewer: Renato Araújo <renato.filho@openbossa.org>
          Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Hugo Parente Lima 2011-07-27 19:24:54 -03:00
commit f918fdb490
5 changed files with 84 additions and 17 deletions

View file

@ -731,6 +731,59 @@ PySideSignal* newObject(const char* name, ...)
return self;
}
template<typename T>
static typename T::value_type join(T t, const char* sep)
{
typename T::value_type res;
if (!t.size())
return res;
typename T::const_iterator it = t.begin();
typename T::const_iterator end = t.end();
res += *it;
++it;
while (it != end) {
res += sep;
res += *it;
++it;
}
return res;
}
void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject)
{
typedef QHash<QByteArray, QList<QByteArray> > SignalSigMap;
SignalSigMap signalsFound;
for(int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) {
QMetaMethod method = metaObject->method(i);
QByteArray methodName(method.signature());
methodName.chop(methodName.size() - methodName.indexOf('('));
if (method.methodType() == QMetaMethod::Signal)
signalsFound[methodName] << join(method.parameterTypes(), ",");
}
SignalSigMap::Iterator it = signalsFound.begin();
SignalSigMap::Iterator end = signalsFound.end();
for (; it != end; ++it) {
PySideSignal* self = PyObject_New(PySideSignal, &PySideSignalType);
self->signalName = strdup(it.key().constData());
self->signaturesSize = 0;
self->signatures = 0;
self->initialized = 0;
self->homonymousMethod = 0;
qSort(it.value().begin(), it.value().end());
SignalSigMap::mapped_type::const_iterator j = it.value().begin();
SignalSigMap::mapped_type::const_iterator endJ = it.value().end();
for (; j != endJ; ++j)
appendSignature(self, strdup(j->constData()));
addSignalToWrapper(pyObj, it.key(), self);
Py_DECREF((PyObject*) self);
}
}
PyObject* buildQtCompatible(const char* signature)
{

View file

@ -57,9 +57,15 @@ PYSIDE_API bool checkType(PyObject* type);
* @param name of the Signal to be registered on meta object
* @param signatures a list of signatures supported by this signal, ended with a NULL pointer
* @return Return a new reference to PyObject* of type PySideSignal
* @deprecated Use registerSignals
**/
PYSIDE_API PySideSignal* newObject(const char* name, ...);
/**
* Register all C++ signals of a QObject on Python type.
*/
PYSIDE_API void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject);
/**
* This function creates a Signal object which stay attached to QObject class based on a list of QMetaMethod
*
@ -104,10 +110,7 @@ PYSIDE_API const char* getSignature(PySideSignalInstance* signal);
PYSIDE_API void updateSourceObject(PyObject* source);
/**
* This function is used to retrieve the signal signature
*
* @param self The Signal object
* @return Return the signal signature
* @deprecated Use registerSignals
**/
PYSIDE_API void addSignalToWrapper(SbkObjectType* wrapperType, const char* signalName, PySideSignal* signal);