diff options
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/signalmanager.cpp | 22 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 4 |
2 files changed, 26 insertions, 0 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 22b6d80fc..7a3236fd1 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -42,6 +42,7 @@ #include <QDebug> #include <limits> #include <typeresolver.h> +#include <basewrapper.h> #if QSLOT_CODE != 1 || QSIGNAL_CODE != 2 #error QSLOT_CODE and/or QSIGNAL_CODE changed! change the hardcoded stuff to the correct value! @@ -289,3 +290,24 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, } return -1; } + +bool SignalManager::registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type) +{ + const QMetaObject* metaObject = source->metaObject(); + int methodIndex = metaObject->indexOfMethod(signature); + // Create the dynamic signal is needed + if (methodIndex == -1) { + Shiboken::SbkBaseWrapper* self = (Shiboken::SbkBaseWrapper*) Shiboken::BindingManager::instance().retrieveWrapper(source); + if (!self->containsCppWrapper) { + qWarning() << "You can't add dynamic signals or slots on an object originated from C++."; + return false; + } else { + PySide::DynamicQMetaObject* dynMetaObj = reinterpret_cast<PySide::DynamicQMetaObject*>(const_cast<QMetaObject*>(metaObject)); + if (type == QMetaMethod::Signal) + dynMetaObj->addSignal(signature); + else + dynMetaObj->addSlot(signature); + } + } + return true; +} diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 60888ee0c..67031a6c7 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -39,6 +39,7 @@ #include <Python.h> #include <Qt> #include <QStringList> +#include <QMetaMethod> class QObject; @@ -62,6 +63,9 @@ public: void globalReceiverConnectNotify(int slotIndex); void globalReceiverDisconnectNotify(int slotIndex); + + // Used to register a new signal/slot on QMetaobjc of source. + static bool registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type); private: struct SignalManagerPrivate; SignalManagerPrivate* m_d; |