diff --git a/src/Gui/WidgetFactory.cpp b/src/Gui/WidgetFactory.cpp index 4ffeeff5db..d55c7b7c7c 100644 --- a/src/Gui/WidgetFactory.cpp +++ b/src/Gui/WidgetFactory.cpp @@ -422,8 +422,39 @@ QIcon *PythonWrapper::toQIcon(PyObject *pyobj) return 0; } +Py::Object PythonWrapper::fromQDir(const QDir& dir) +{ +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + const char* typeName = typeid(dir).name(); + PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast(getPyTypeObjectForTypeName()), + const_cast(&dir), false, false, typeName); + if (pyobj) + return Py::asObject(pyobj); +#endif + throw Py::RuntimeError("Failed to wrap icon"); +} + +QDir* PythonWrapper::toQDir(PyObject* pyobj) +{ +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + PyTypeObject* type = getPyTypeObjectForTypeName(); + if (type) { + if (Shiboken::Object::checkType(pyobj)) { + SbkObject* sbkobject = reinterpret_cast(pyobj); + void* cppobject = Shiboken::Object::cppPointer(sbkobject, type); + return reinterpret_cast(cppobject); + } + } +#else + Q_UNUSED(pyobj); +#endif + return nullptr; +} + Py::Object PythonWrapper::fromQObject(QObject* object, const char* className) { + if (!object) + return Py::None(); #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) // Access shiboken/PySide via C++ // @@ -563,6 +594,21 @@ bool PythonWrapper::loadWidgetsModule() return true; } +bool PythonWrapper::loadUiToolsModule() +{ +#if defined (HAVE_SHIBOKEN2) && defined(HAVE_PYSIDE2) + // QtUiTools + static PyTypeObject** SbkPySide2_QtUiToolsTypes = nullptr; + if (!SbkPySide2_QtUiToolsTypes) { + Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PySide2.QtUiTools")); + if (requiredModule.isNull()) + return false; + SbkPySide2_QtUiToolsTypes = Shiboken::Module::getTypes(requiredModule); + } +#endif + return true; +} + void PythonWrapper::createChildrenNameAttributes(PyObject* root, QObject* object) { Q_FOREACH (QObject* child, object->children()) { diff --git a/src/Gui/WidgetFactory.h b/src/Gui/WidgetFactory.h index d1d1ecf6eb..def0235037 100644 --- a/src/Gui/WidgetFactory.h +++ b/src/Gui/WidgetFactory.h @@ -35,6 +35,10 @@ #include "PropertyPage.h" #include +QT_BEGIN_NAMESPACE +class QDir; +QT_END_NAMESPACE + namespace Gui { namespace Dialog{ class PreferencePage; @@ -47,6 +51,7 @@ public: bool loadCoreModule(); bool loadGuiModule(); bool loadWidgetsModule(); + bool loadUiToolsModule(); bool toCString(const Py::Object&, std::string&); QObject* toQObject(const Py::Object&); @@ -60,6 +65,8 @@ public: */ Py::Object fromQIcon(const QIcon*); QIcon *toQIcon(PyObject *pyobj); + Py::Object fromQDir(const QDir&); + QDir* toQDir(PyObject* pyobj); static void createChildrenNameAttributes(PyObject* root, QObject* object); static void setParent(PyObject* pyWdg, QObject* parent); };