diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-05-12 17:21:19 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-05-17 19:53:26 -0300 |
commit | fde014f5db8f35727585e4402849ef565987c63a (patch) | |
tree | b1e01f16ab127948d8548a08993da9e2664374dd /libpyside | |
parent | ac217286e20644cd2519cde6c2588761b6a39cd6 (diff) |
Implemented support to slot decoration.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/dynamicqmetaobject.cpp | 24 | ||||
-rw-r--r-- | libpyside/dynamicqmetaobject.h | 6 |
2 files changed, 30 insertions, 0 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index dbc51803c..a2e6bef0f 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -123,6 +123,30 @@ void DynamicQMetaObject::removeSlot(uint index) } } +DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyTypeObject *type, const QMetaObject *base) +{ + PyObject *key, *value; + Py_ssize_t pos = 0; + + QString className(type->tp_name); + className = className.mid(className.lastIndexOf(".")+1); + DynamicQMetaObject *mo = new PySide::DynamicQMetaObject(className.toAscii(), base); + + while (PyDict_Next(type->tp_dict, &pos, &key, &value)) { + if (!PyFunction_Check(value)) + continue; + + if (PyObject_HasAttrString(value, PYSIDE_SLOT_LIST_ATTR)) { + PyObject *signature_list = PyObject_GetAttrString(value, PYSIDE_SLOT_LIST_ATTR); + for(Py_ssize_t i=0, i_max=PyList_Size(signature_list); i < i_max; i++) { + PyObject *signature = PyList_GET_ITEM(signature_list, i); + mo->addSlot(PyString_AsString(signature)); + } + } + } + return mo; +} + void DynamicQMetaObject::removeSignal(uint index) { //Current Qt implementation does not support runtime remove signal diff --git a/libpyside/dynamicqmetaobject.h b/libpyside/dynamicqmetaobject.h index d6f6e9be5..9336b63ac 100644 --- a/libpyside/dynamicqmetaobject.h +++ b/libpyside/dynamicqmetaobject.h @@ -36,10 +36,13 @@ #define DYNAMICQMETAOBJECT_H #include "pysidemacros.h" +#include <Python.h> #include <QMetaObject> #include <QLinkedList> #include <QByteArray> +#define PYSIDE_SLOT_LIST_ATTR "_slots" + class QObject; namespace PySide @@ -57,6 +60,9 @@ public: void removeSignal(uint idex); void removeSlot(uint index); + //Retrieve Python metadata to create QMetaObject (class name, signals, slot) + static DynamicQMetaObject *createBasedOn(PyTypeObject *obj, const QMetaObject* base); + private: QLinkedList<QByteArray> m_signals; QLinkedList<QByteArray> m_slots; |