diff --git a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp index 95ed0e510..779b2506b 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp +++ b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp @@ -64,6 +64,8 @@ extern "C" PyObject *PyInit__renderdoc(void); extern "C" PyObject *PassObjectToPython(const char *type, void *obj); // this one is in qrenderdoc_python.cpp extern "C" PyObject *PyInit__qrenderdoc(void); +extern "C" PyObject *WrapBareQWidget(PyObject *, QWidget *); +extern "C" QWidget *UnwrapBareQWidget(PyObject *); #ifdef WIN32 @@ -617,25 +619,31 @@ QWidget *PythonContext::QWidgetFromPy(PyObject *widget) return NULL; if(!SbkPySide2_QtCoreTypes || !SbkPySide2_QtGuiTypes || !SbkPySide2_QtWidgetsTypes) - return NULL; + return UnwrapBareQWidget(widget); if(!Shiboken::Object::checkType(widget)) - return NULL; + return UnwrapBareQWidget(widget); return (QWidget *)Shiboken::Object::cppPointer((SbkObject *)widget, Shiboken::SbkType()); #else - return NULL; + return UnwrapBareQWidget(widget); #endif } -PyObject *PythonContext::QtObjectToPython(const char *typeName, QObject *object) +PyObject *PythonContext::QtObjectToPython(PyObject *self, const char *typeName, QObject *object) { #if PYSIDE2_ENABLED if(!initialised()) - return NULL; + Py_RETURN_NONE; if(!SbkPySide2_QtCoreTypes || !SbkPySide2_QtGuiTypes || !SbkPySide2_QtWidgetsTypes) - return NULL; + { + QWidget *w = qobject_cast(object); + if(self && w) + return WrapBareQWidget(self, w); + + Py_RETURN_NONE; + } PyObject *obj = Shiboken::Object::newObject(reinterpret_cast(Shiboken::SbkType()), @@ -643,7 +651,11 @@ PyObject *PythonContext::QtObjectToPython(const char *typeName, QObject *object) return obj; #else - return NULL; + QWidget *w = qobject_cast(object); + if(self && w) + return WrapBareQWidget(self, w); + + Py_RETURN_NONE; #endif } diff --git a/qrenderdoc/Code/pyrenderdoc/PythonContext.h b/qrenderdoc/Code/pyrenderdoc/PythonContext.h index a9507fc15..d3d549ee1 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonContext.h +++ b/qrenderdoc/Code/pyrenderdoc/PythonContext.h @@ -72,7 +72,7 @@ public: const char *typeName = typeid(*const_cast(object)).name(); // forward non-template part on - PyObject *obj = QtObjectToPython(typeName, object); + PyObject *obj = QtObjectToPython(NULL, typeName, object); if(obj) setPyGlobal(varName, obj); @@ -83,7 +83,10 @@ public: {}); } - static PyObject *QWidgetToPy(QWidget *widget) { return QtObjectToPython("QWidget", widget); } + static PyObject *QWidgetToPy(PyObject *self, QWidget *widget) + { + return QtObjectToPython(self, "QWidget", widget); + } static QWidget *QWidgetFromPy(PyObject *widget); void abort() { m_Abort = true; } @@ -125,7 +128,7 @@ private: bool m_Abort = false; - static PyObject *QtObjectToPython(const char *typeName, QObject *object); + static PyObject *QtObjectToPython(PyObject *self, const char *typeName, QObject *object); QTimer *outputTicker; QMutex outputMutex; diff --git a/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i b/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i index 8d019e33f..2e509b2ce 100644 --- a/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i +++ b/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i @@ -28,7 +28,7 @@ CONTAINER_TYPEMAPS(QMap) } %typemap(out) QWidget * { - $result = PythonContext::QWidgetToPy($1); + $result = PythonContext::QWidgetToPy(self, $1); } // need to ignore the original function and add a helper that releases the python GIL while calling @@ -101,3 +101,27 @@ CONTAINER_TYPEMAPS(QMap) } #endif %} + +// declare functions for using swig opaque wrap/unwrap of QWidget, for when pyside isn't available. +%wrapper %{ + +PyObject *WrapBareQWidget(PyObject *self, QWidget *widget) +{ + return SWIG_NewPointerObj(SWIG_as_voidptr(widget), SWIGTYPE_p_QWidget, SWIG_BUILTIN_INIT); +} + +QWidget *UnwrapBareQWidget(PyObject *obj) +{ + QWidget *ret = NULL; + int res = 0; + + res = SWIG_ConvertPtr(obj, (void **)&ret,SWIGTYPE_p_QWidget, 0); + if(!SWIG_IsOK(res)) + { + SWIG_exception_fail(SWIG_ArgError(res), "in method 'UnwrapBareQWidget'"); + } +fail: + return NULL; +} + +%} \ No newline at end of file