diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index 20849aedc..3c442c80f 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -75,6 +75,8 @@ if(PYSIDE_INCLUDE_DIR) add_definitions(-DHAVE_PYSIDE) include_directories( ${PYSIDE_INCLUDE_DIR} + ${PYSIDE_INCLUDE_DIR}/QtCore + ${PYSIDE_INCLUDE_DIR}/QtGui ) set(FreeCADGui_LIBS ${FreeCADGui_LIBS} diff --git a/src/Gui/TaskView/TaskDialogPython.cpp b/src/Gui/TaskView/TaskDialogPython.cpp index c087e051e..71c9e02ea 100644 --- a/src/Gui/TaskView/TaskDialogPython.cpp +++ b/src/Gui/TaskView/TaskDialogPython.cpp @@ -195,7 +195,7 @@ TaskWatcherPython::TaskWatcherPython(const Py::Object& o) Py::List list(watcher.getAttr(std::string("widgets"))); Gui::PythonWrapper wrap; - if (wrap.loadModule()) { + if (wrap.loadCoreModule()) { for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { QObject* object = wrap.toQObject(*it); if (object) { @@ -293,7 +293,7 @@ TaskDialogPython::TaskDialogPython(const Py::Object& o) : dlg(o) } Gui::PythonWrapper wrap; - if (wrap.loadModule()) { + if (wrap.loadCoreModule()) { for (Py::List::iterator it = widgets.begin(); it != widgets.end(); ++it) { QObject* object = wrap.toQObject(*it); if (object) { diff --git a/src/Gui/WidgetFactory.cpp b/src/Gui/WidgetFactory.cpp index a499c326b..12f5b9a5e 100644 --- a/src/Gui/WidgetFactory.cpp +++ b/src/Gui/WidgetFactory.cpp @@ -34,8 +34,10 @@ # include # include # ifdef HAVE_PYSIDE -# include +# include +# include PyTypeObject** SbkPySide_QtCoreTypes=NULL; +PyTypeObject** SbkPySide_QtGuiTypes=NULL; # endif #endif @@ -84,7 +86,16 @@ QObject* PythonWrapper::toQObject(const Py::Object& pyobject) Py::Object PythonWrapper::toPython(QWidget* widget) { - // todo: Port to PySide +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + PyTypeObject * type = Shiboken::SbkType(); + if (type) { + SbkObjectType* sbk_type = reinterpret_cast(type); + std::string typeName = widget->metaObject()->className(); + PyObject* pyobj = Shiboken::Object::newObject(sbk_type, widget, false, false, typeName.c_str()); + return Py::Object(pyobj); + } + throw Py::RuntimeError("Failed to wrap widget"); +#else Py::Module sipmod(PyImport_AddModule((char*)"sip")); Py::Callable func = sipmod.getDict().getItem("wrapinstance"); Py::Tuple arguments(2); @@ -92,17 +103,33 @@ Py::Object PythonWrapper::toPython(QWidget* widget) Py::Module qtmod(PyImport_ImportModule((char*)"PyQt4.Qt")); arguments[1] = qtmod.getDict().getItem("QWidget"); return func.apply(arguments); +#endif } -bool PythonWrapper::loadModule() +bool PythonWrapper::loadCoreModule() { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - if (SbkPySide_QtCoreTypes) - return true; // already loaded - Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PySide.QtCore")); - if (requiredModule.isNull()) - return false; - SbkPySide_QtCoreTypes = Shiboken::Module::getTypes(requiredModule); + // QtCore + if (!SbkPySide_QtCoreTypes) { + Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PySide.QtCore")); + if (requiredModule.isNull()) + return false; + SbkPySide_QtCoreTypes = Shiboken::Module::getTypes(requiredModule); + } +#endif + return true; +} + +bool PythonWrapper::loadGuiModule() +{ +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + // QtGui + if (!SbkPySide_QtGuiTypes) { + Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PySide.QtGui")); + if (requiredModule.isNull()) + return false; + SbkPySide_QtGuiTypes = Shiboken::Module::getTypes(requiredModule); + } #endif return true; } @@ -311,7 +338,7 @@ Py::Object UiLoaderPy::createWidget(const Py::Tuple& args) // 2nd argument QWidget* parent = 0; - if (wrap.loadModule() && args.size() > 1) { + if (wrap.loadCoreModule() && args.size() > 1) { QObject* object = wrap.toQObject(args[1]); if (object) parent = qobject_cast(object); @@ -325,6 +352,7 @@ Py::Object UiLoaderPy::createWidget(const Py::Tuple& args) QWidget* widget = loader.createWidget(QString::fromAscii(className.c_str()), parent, QString::fromAscii(objectName.c_str())); + wrap.loadGuiModule(); return wrap.toPython(widget); } diff --git a/src/Gui/WidgetFactory.h b/src/Gui/WidgetFactory.h index 5442c7efc..7f5faa0cf 100644 --- a/src/Gui/WidgetFactory.h +++ b/src/Gui/WidgetFactory.h @@ -43,7 +43,8 @@ class GuiExport PythonWrapper { public: PythonWrapper(); - bool loadModule(); + bool loadCoreModule(); + bool loadGuiModule(); QObject* toQObject(const Py::Object&); Py::Object toPython(QWidget*);