From 112b25f9fcf7c5bab39cde3d291c840c3fe9ec3d Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 30 Jun 2013 23:34:24 +0200 Subject: [PATCH] Expose getMainWindow() to Python --- src/Gui/Application.h | 1 + src/Gui/ApplicationPy.cpp | 19 +++++++++++++++++++ src/Gui/WidgetFactory.cpp | 12 ++++++++---- src/Gui/WidgetFactory.h | 2 +- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/Gui/Application.h b/src/Gui/Application.h index 73945fca4..8d4aefe5a 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 31df22271..fb3de1211 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 12f5b9a5e..caf4b9be2 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 7f5faa0cf..44690d587 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); }; /**