From c9532316ff393f0197ab3dd273bb16aadebe879f Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Mon, 23 Jun 2025 19:42:03 +0200 Subject: [PATCH] Gui: Fix wildcard call disconnects warnings Qt6.9 (#22096) * Gui: Fix wildcard call disconnects warnings Qt6.9 * Gui: Fix typo --------- Co-authored-by: Benjamin Nauck --- src/Gui/PythonWrapper.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Gui/PythonWrapper.cpp b/src/Gui/PythonWrapper.cpp index 1bda2cf2d1..e18d9b1d84 100644 --- a/src/Gui/PythonWrapper.cpp +++ b/src/Gui/PythonWrapper.cpp @@ -392,34 +392,39 @@ public: */ void addQObject(QObject* obj, PyObject* pyobj) { - const auto PyW_unique_name = QString::number(reinterpret_cast (pyobj)); - auto PyW_invalidator = findChild (PyW_unique_name, Qt::FindDirectChildrenOnly); + // static array to contain created connections so they can be safely disconnected later + static std::map connections = {}; + + const auto PyW_uniqueName = QString::number(reinterpret_cast(pyobj)); + auto PyW_invalidator = findChild(PyW_uniqueName, Qt::FindDirectChildrenOnly); if (PyW_invalidator == nullptr) { PyW_invalidator = new QObject(this); - PyW_invalidator->setObjectName(PyW_unique_name); + PyW_invalidator->setObjectName(PyW_uniqueName); Py_INCREF (pyobj); } - else { - PyW_invalidator->disconnect(); + else if (connections.contains(PyW_invalidator)) { + disconnect(connections[PyW_invalidator]); + connections.erase(PyW_invalidator); } - auto destroyedFun = [pyobj](){ + auto destroyedFun = [pyobj]() { Base::PyGILStateLocker lock; - auto sbk_ptr = reinterpret_cast (pyobj); - if (sbk_ptr != nullptr) { - Shiboken::Object::setValidCpp(sbk_ptr, false); + + if (auto sbkPtr = reinterpret_cast(pyobj); sbkPtr != nullptr) { + Shiboken::Object::setValidCpp(sbkPtr, false); } else { Base::Console().developerError("WrapperManager", "A QObject has just been destroyed after its Pythonic wrapper.\n"); } + Py_DECREF (pyobj); }; - QObject::connect(PyW_invalidator, &QObject::destroyed, this, destroyedFun); - QObject::connect(obj, &QObject::destroyed, PyW_invalidator, &QObject::deleteLater); -} + connections[PyW_invalidator] = connect(PyW_invalidator, &QObject::destroyed, this, destroyedFun); + connect(obj, &QObject::destroyed, PyW_invalidator, &QObject::deleteLater); + } private: void wrapQApplication()