From eb31752998d01572252be81d1dc6df72caed9b0b Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 22 Dec 2022 16:48:41 +0100 Subject: [PATCH] Gui: [skip ci] move widget() handling to MDIViewPyWrapImp --- src/Gui/MDIViewPyWrap.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Gui/MDIViewPyWrap.cpp b/src/Gui/MDIViewPyWrap.cpp index 762ea5ff82..3e29a15568 100644 --- a/src/Gui/MDIViewPyWrap.cpp +++ b/src/Gui/MDIViewPyWrap.cpp @@ -45,7 +45,7 @@ public: : pyobject{pyobject} { Base::PyGILStateLocker lock; - std::vector methods = {"onMsg", "onHasMsg", "canClose", "printDocument", "print", "printPdf", "printPreview", "redoActions", "undoActions"}; + std::vector methods = {"widget", "onMsg", "onHasMsg", "canClose", "printDocument", "print", "printPdf", "printPreview", "redoActions", "undoActions"}; for (const auto& it : methods) { if (pyobject.hasAttr(it)) { @@ -61,6 +61,19 @@ public: func.clear(); } + QWidget* widget() + { + Base::PyGILStateLocker lock; + PythonWrapper wrap; + wrap.loadWidgetsModule(); + if (func.count("widget") == 0) { + throw Py::AttributeError("Object has no attribute 'widget'"); + } + Py::Callable target(func.at("widget")); + Py::Object pywidget(target.apply(Py::Tuple())); + return qobject_cast(wrap.toQObject(pywidget)); + } + bool onMsg(const char* pMsg) { Base::PyGILStateLocker lock; @@ -156,17 +169,14 @@ MDIViewPyWrap::MDIViewPyWrap(Py::Object py, Gui::Document* pcDocument,QWidget* p : MDIView(pcDocument, parent, wflags) , ptr(std::make_unique(py)) { - Base::PyGILStateLocker lock; try { - PythonWrapper wrap; - wrap.loadWidgetsModule(); - Py::Object pywidget = py.callMemberFunction("widget"); - QWidget* widget = qobject_cast(wrap.toQObject(pywidget)); + QWidget* widget = ptr->widget(); if (widget) { setCentralWidget(widget); } } catch (Py::Exception&) { + Base::PyGILStateLocker lock; Base::PyException e; e.ReportException(); }