diff options
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/pyside.cpp | 3 | ||||
-rw-r--r-- | libpyside/signalmanager.cpp | 25 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 14 |
3 files changed, 24 insertions, 18 deletions
diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp index 3fa63a498..93271c8ba 100644 --- a/libpyside/pyside.cpp +++ b/libpyside/pyside.cpp @@ -34,6 +34,7 @@ #include "pyside.h" +#include "signalmanager.h" extern "C" void init_signal(PyObject* module); extern "C" void init_slot(PyObject* module); @@ -45,6 +46,8 @@ void init(PyObject *module) { init_signal(module); init_slot(module); + // Init signal manager, so it will register some meta types used by QVariant. + SignalManager::instance(); } } //namespace PySide diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 80d7254b7..7ac3f3067 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -54,35 +54,22 @@ #define PYTHON_TYPE "PyObject" - -// Use this to wrap PyObject during the Signal/Slot handling -struct PyObjectWrapper -{ - PyObject* m_me; - PyObjectWrapper(const PyObjectWrapper &other) : m_me(other.m_me) {} - PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } - PyObjectWrapper() : m_me(Py_None) {} - operator PyObject*() const { return m_me; } -}; - -Q_DECLARE_METATYPE(PyObjectWrapper) - namespace Shiboken { template<> -struct Converter<PyObjectWrapper> +struct Converter<PySide::PyObjectWrapper> { - static PyObjectWrapper toCpp(PyObject* obj) + static PySide::PyObjectWrapper toCpp(PyObject* obj) { - return PyObjectWrapper(obj); + return PySide::PyObjectWrapper(obj); } static PyObject* toPython(void* obj) { - return toPython(*reinterpret_cast<PyObjectWrapper*>(obj)); + return toPython(*reinterpret_cast<PySide::PyObjectWrapper*>(obj)); } - static PyObject* toPython(const PyObjectWrapper& obj) + static PyObject* toPython(const PySide::PyObjectWrapper& obj) { return obj; } @@ -202,6 +189,8 @@ SignalManager::SignalManager() : m_d(new SignalManagerPrivate) qRegisterMetaType<PyObjectWrapper>(PYTHON_TYPE); TypeResolver::createValueTypeResolver<PyObjectWrapper>(PYTHON_TYPE); + TypeResolver::createValueTypeResolver<PyObjectWrapper>("object"); + TypeResolver::createValueTypeResolver<PyObjectWrapper>("PySide::PyObjectWrapper"); } void SignalManager::clear() diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 233adf1ff..9687dcc3e 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -46,6 +46,17 @@ class QObject; namespace PySide { +/// Thin wrapper for PyObject which increases the reference count at the constructor but *NOT* at destructor. +class PYSIDE_API PyObjectWrapper +{ +public: + PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } + PyObjectWrapper() : m_me(Py_None) { Py_INCREF(m_me); } + operator PyObject*() const { return m_me; } +private: + PyObject* m_me; +}; + PYSIDE_API bool isSignal(const char* signal); PYSIDE_API bool checkSignal(const char* signal); PYSIDE_API QString getCallbackSignature(const char* signal, PyObject* callback, bool encodeName); @@ -84,4 +95,7 @@ private: }; } + +Q_DECLARE_METATYPE(PySide::PyObjectWrapper) + #endif |