From 25582fc6607be35ad09e3aac88afc017dda892a0 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Tue, 23 Jan 2024 12:45:04 +0100 Subject: [PATCH] Gui: unify getPyTypeObjectForTypeName --- src/Gui/PythonWrapper.cpp | 136 ++++++++++++++------------------------ 1 file changed, 48 insertions(+), 88 deletions(-) diff --git a/src/Gui/PythonWrapper.cpp b/src/Gui/PythonWrapper.cpp index 503d191bcf99..0ac229702b3b 100644 --- a/src/Gui/PythonWrapper.cpp +++ b/src/Gui/PythonWrapper.cpp @@ -245,8 +245,34 @@ void registerTypes() // -------------------------------------------------------- namespace Gui { + template -PyTypeObject *getPyTypeObjectForTypeName(); +#if defined (HAVE_SHIBOKEN2) +SbkObjectType* +#else +PyTypeObject* +#endif +getPyTypeObjectForTypeName() +{ +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) +#if defined (HAVE_SHIBOKEN_TYPE_FOR_TYPENAME) +# if defined (HAVE_SHIBOKEN2) + auto sbkType = Shiboken::ObjectType::typeForTypeName(typeid(qttype).name()); + if (sbkType) + return reinterpret_cast&(sbkType->type); +# else + return Shiboken::ObjectType::typeForTypeName(typeid(qttype).name()); +# endif +#else +# if defined (HAVE_SHIBOKEN2) + return reinterpret_cast(Shiboken::SbkType()); +# else + return Shiboken::SbkType(); +# endif +#endif +#endif + return nullptr; +} /*! * \brief The WrapperManager class @@ -318,15 +344,9 @@ class WrapperManager : public QObject // import gc // gc.collect() #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - PyTypeObject * type = getPyTypeObjectForTypeName(); + auto type = getPyTypeObjectForTypeName(); if (type) { -#if defined (HAVE_SHIBOKEN2) - auto sbk_type = reinterpret_cast(type); -#else - auto sbk_type = type; -#endif - std::string typeName = "QApplication"; - PyObject* pyobj = Shiboken::Object::newObject(sbk_type, qApp, false, false, typeName.c_str()); + PyObject* pyobj = Shiboken::Object::newObject(type, qApp, false, false, "QApplication"); addQObject(qApp, pyobj); } #endif @@ -415,35 +435,15 @@ void* qt_getCppPointer(const Py::Object& pyobject, const std::string& unwrap) return PyLong_AsVoidPtr(result[0].ptr()); } - -template -PyTypeObject *getPyTypeObjectForTypeName() -{ -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) -#if defined (HAVE_SHIBOKEN_TYPE_FOR_TYPENAME) -#if defined (HAVE_SHIBOKEN2) - SbkObjectType* sbkType = Shiboken::ObjectType::typeForTypeName(typeid(qttype).name()); - if (sbkType) - return &(sbkType->type); -#else - return Shiboken::ObjectType::typeForTypeName(typeid(qttype).name()); -#endif -#else - return Shiboken::SbkType(); -#endif -#endif - return nullptr; -} - template qttype* qt_getCppType(PyObject* pyobj) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - PyTypeObject * type = getPyTypeObjectForTypeName(); + auto type = getPyTypeObjectForTypeName(); if (type) { if (Shiboken::Object::checkType(pyobj)) { auto sbkobject = reinterpret_cast(pyobj); - void* cppobject = Shiboken::Object::cppPointer(sbkobject, type); + void* cppobject = Shiboken::Object::cppPointer(sbkobject, reinterpret_cast(type)); return static_cast(cppobject); } } @@ -536,22 +536,17 @@ QGraphicsObject* PythonWrapper::toQGraphicsObject(const Py::Object& pyobject) Py::Object PythonWrapper::fromQImage(const QImage& img) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) -#if defined (HAVE_SHIBOKEN2) - PyObject* pyobj = Shiboken::Conversions::copyToPython(reinterpret_cast(getPyTypeObjectForTypeName()), - const_cast(&img)); -#else PyObject* pyobj = Shiboken::Conversions::copyToPython(getPyTypeObjectForTypeName(), const_cast(&img)); -#endif if (pyobj) { return Py::asObject(pyobj); } + + throw Py::RuntimeError("Failed to wrap image"); #else // Access shiboken/PySide via Python - // return qt_wrapInstance(&img, "QImage", "QtGui", "wrapInstance"); #endif - throw Py::RuntimeError("Failed to wrap icon"); } QImage *PythonWrapper::toQImage(PyObject *pyobj) @@ -563,21 +558,16 @@ Py::Object PythonWrapper::fromQIcon(const QIcon* icon) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) const char* typeName = typeid(*const_cast(icon)).name(); -#if defined (HAVE_SHIBOKEN2) - PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast(getPyTypeObjectForTypeName()), - const_cast(icon), true, false, typeName); -#else PyObject* pyobj = Shiboken::Object::newObject(getPyTypeObjectForTypeName(), const_cast(icon), true, false, typeName); -#endif if (pyobj) return Py::asObject(pyobj); + + throw Py::RuntimeError("Failed to wrap icon"); #else // Access shiboken/PySide via Python - // return qt_wrapInstance(icon, "QIcon", "QtGui", "wrapInstance"); #endif - throw Py::RuntimeError("Failed to wrap icon"); } QIcon *PythonWrapper::toQIcon(PyObject *pyobj) @@ -589,19 +579,14 @@ Py::Object PythonWrapper::fromQDir(const QDir& dir) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) const char* typeName = typeid(dir).name(); -#if defined (HAVE_SHIBOKEN2) - PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast(getPyTypeObjectForTypeName()), - const_cast(&dir), false, false, typeName); -#else PyObject* pyobj = Shiboken::Object::newObject(getPyTypeObjectForTypeName(), const_cast(&dir), false, false, typeName); -#endif if (pyobj) return Py::asObject(pyobj); #else Q_UNUSED(dir) #endif - throw Py::RuntimeError("Failed to wrap icon"); + throw Py::RuntimeError("Failed to wrap directory"); } QDir* PythonWrapper::toQDir(PyObject* pyobj) @@ -615,25 +600,23 @@ Py::Object PythonWrapper::fromQPrinter(QPrinter* printer) return Py::None(); #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) // Access shiboken/PySide via C++ - // - PyTypeObject * type = getPyTypeObjectForTypeName(); + auto type = getPyTypeObjectForTypeName(); if (!type) { - type = Shiboken::Conversions::getPythonTypeObject("QPrinter"); - } - if (type) { + // XXX: Why is QPrinter special? #if defined (HAVE_SHIBOKEN2) - auto sbk_type = reinterpret_cast(type); + type = reinterpret_cast(Shiboken::Conversions::getPythonTypeObject("QPrinter")); #else - auto sbk_type = type; + type = Shiboken::Conversions::getPythonTypeObject("QPrinter"); #endif - PyObject* pyobj = Shiboken::Object::newObject(sbk_type, printer, false, false, "QPrinter"); + } + if (type) { + PyObject* pyobj = Shiboken::Object::newObject(type, printer, false, false, "QPrinter"); return Py::asObject(pyobj); } - throw Py::RuntimeError("Failed to wrap object"); + throw Py::RuntimeError("Failed to wrap printer"); #else // Access shiboken/PySide via Python - // return qt_wrapInstance(printer, "QPrinter", "QtCore", "wrapInstance"); #endif } @@ -644,27 +627,20 @@ Py::Object PythonWrapper::fromQObject(QObject* object, const char* className) return Py::None(); #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) // Access shiboken/PySide via C++ - // - PyTypeObject * type = getPyTypeObjectForTypeName(); + auto type = getPyTypeObjectForTypeName(); if (type) { -#if defined (HAVE_SHIBOKEN2) - auto sbk_type = reinterpret_cast(type); -#else - auto sbk_type = type; -#endif std::string typeName; if (className) typeName = className; else typeName = object->metaObject()->className(); - PyObject* pyobj = Shiboken::Object::newObject(sbk_type, object, false, false, typeName.c_str()); + PyObject* pyobj = Shiboken::Object::newObject(type, object, false, false, typeName.c_str()); WrapperManager::instance().addQObject(object, pyobj); return Py::asObject(pyobj); } throw Py::RuntimeError("Failed to wrap object"); #else // Access shiboken/PySide via Python - // return qt_wrapInstance(object, className, "QtCore", "wrapInstance"); #endif } @@ -673,28 +649,20 @@ Py::Object PythonWrapper::fromQWidget(QWidget* widget, const char* className) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) // Access shiboken/PySide via C++ - // - PyTypeObject * type = getPyTypeObjectForTypeName(); + auto type = getPyTypeObjectForTypeName(); if (type) { -#if defined (HAVE_SHIBOKEN2) - auto sbk_type = reinterpret_cast(type); -#else - auto sbk_type = type; -#endif std::string typeName; if (className) typeName = className; else typeName = widget->metaObject()->className(); - PyObject* pyobj = Shiboken::Object::newObject(sbk_type, widget, false, false, typeName.c_str()); + PyObject* pyobj = Shiboken::Object::newObject(type, widget, false, false, typeName.c_str()); WrapperManager::instance().addQObject(widget, pyobj); return Py::asObject(pyobj); } throw Py::RuntimeError("Failed to wrap widget"); - #else // Access shiboken/PySide via Python - // return qt_wrapInstance(widget, className, "QtWidgets", "wrapInstance"); #endif } @@ -768,11 +736,7 @@ void PythonWrapper::createChildrenNameAttributes(PyObject* root, QObject* object bool hasAttr = PyObject_HasAttrString(root, name.constData()); if (!hasAttr) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) -#if defined (HAVE_SHIBOKEN2) - Shiboken::AutoDecRef pyChild(Shiboken::Conversions::pointerToPython(reinterpret_cast(getPyTypeObjectForTypeName()), child)); -#else Shiboken::AutoDecRef pyChild(Shiboken::Conversions::pointerToPython(getPyTypeObjectForTypeName(), child)); -#endif PyObject_SetAttrString(root, name.constData(), pyChild); #else const char* className = qt_identifyType(child, "QtWidgets"); @@ -797,11 +761,7 @@ void PythonWrapper::setParent(PyObject* pyWdg, QObject* parent) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) if (parent) { -#if defined (HAVE_SHIBOKEN2) - Shiboken::AutoDecRef pyParent(Shiboken::Conversions::pointerToPython(reinterpret_cast(getPyTypeObjectForTypeName()), parent)); -#else Shiboken::AutoDecRef pyParent(Shiboken::Conversions::pointerToPython(getPyTypeObjectForTypeName(), parent)); -#endif Shiboken::Object::setParent(pyParent, pyWdg); } #else