aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/signalmanager.cpp22
-rw-r--r--libpyside/signalmanager.h4
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;