diff --git a/src/Gui/Application.h b/src/Gui/Application.h index 73945fca40..8d4aefe5a1 100644 --- a/src/Gui/Application.h +++ b/src/Gui/Application.h @@ -211,6 +211,7 @@ public: PYFUNCDEF_S(sSendActiveView); + PYFUNCDEF_S(sGetMainWindow); PYFUNCDEF_S(sUpdateGui); PYFUNCDEF_S(sUpdateLocale); PYFUNCDEF_S(sGetLocale); diff --git a/src/Gui/ApplicationPy.cpp b/src/Gui/ApplicationPy.cpp index 31df222718..fb3de12114 100644 --- a/src/Gui/ApplicationPy.cpp +++ b/src/Gui/ApplicationPy.cpp @@ -83,6 +83,9 @@ PyMethodDef Application::Methods[] = { {"addIcon", (PyCFunction) Application::sAddIcon, 1, "addIcon(string, string or list) -> None\n\n" "Add an icon as file name or in XPM format to the system"}, + {"getMainWindow", (PyCFunction) Application::sGetMainWindow, 1, + "getMainWindow() -> QMainWindow\n\n" + "Return the main window instance"}, {"updateGui", (PyCFunction) Application::sUpdateGui, 1, "updateGui() -> None\n\n" "Update the main window and all its windows"}, @@ -418,6 +421,22 @@ PyObject* Application::sSendActiveView(PyObject * /*self*/, PyObject *args,PyObj return Py_None; } +PyObject* Application::sGetMainWindow(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + + PythonWrapper wrap; + wrap.loadCoreModule(); + wrap.loadGuiModule(); + try { + return Py::new_reference_to(wrap.fromQWidget(Gui::getMainWindow(), "QMainWindow")); + } + catch (const Py::Exception&) { + return 0; + } +} + PyObject* Application::sUpdateGui(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/) { if (!PyArg_ParseTuple(args, "")) // convert args: Python->C diff --git a/src/Gui/WidgetFactory.cpp b/src/Gui/WidgetFactory.cpp index 12f5b9a5eb..caf4b9be27 100644 --- a/src/Gui/WidgetFactory.cpp +++ b/src/Gui/WidgetFactory.cpp @@ -84,15 +84,19 @@ QObject* PythonWrapper::toQObject(const Py::Object& pyobject) return 0; } -Py::Object PythonWrapper::toPython(QWidget* widget) +Py::Object PythonWrapper::fromQWidget(QWidget* widget, const char* className) { #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(); + 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()); - return Py::Object(pyobj); + return Py::asObject(pyobj); } throw Py::RuntimeError("Failed to wrap widget"); #else @@ -353,7 +357,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); + return wrap.fromQWidget(widget); } // ---------------------------------------------------- diff --git a/src/Gui/WidgetFactory.h b/src/Gui/WidgetFactory.h index 7f5faa0cf6..44690d5870 100644 --- a/src/Gui/WidgetFactory.h +++ b/src/Gui/WidgetFactory.h @@ -47,7 +47,7 @@ public: bool loadGuiModule(); QObject* toQObject(const Py::Object&); - Py::Object toPython(QWidget*); + Py::Object fromQWidget(QWidget*, const char* className=0); }; /**