diff options
-rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 21 | ||||
-rw-r--r-- | sources/pyside6/libpyside/signalmanager.h | 1 |
2 files changed, 21 insertions, 1 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index b46761284..bb3453bad 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -21,6 +21,7 @@ #include <sbkstaticstrings.h> #include <sbkerrors.h> +#include <QtCore/QCoreApplication> #include <QtCore/QByteArrayView> #include <QtCore/QDebug> #include <QtCore/QHash> @@ -311,8 +312,21 @@ void SignalManager::setQmlMetaCallErrorHandler(QmlMetaCallErrorHandler handler) SignalManagerPrivate::m_qmlMetaCallErrorHandler = handler; } +static void qAppAboutToQuit() +{ + SignalManager::instance().purgeEmptyGlobalReceivers(); +} + QObject *SignalManager::globalReceiver(QObject *sender, PyObject *callback, QObject *receiver) { + static bool registerQuitHandler = true; + if (registerQuitHandler) { + if (auto *app = QCoreApplication::instance()) { + registerQuitHandler = false; + QObject::connect(app, &QCoreApplication::aboutToQuit, qAppAboutToQuit); + } + } + auto &globalReceivers = m_d->m_globalReceivers; const GlobalReceiverKey key = GlobalReceiverV2::key(callback); auto it = globalReceivers.find(key); @@ -326,10 +340,15 @@ QObject *SignalManager::globalReceiver(QObject *sender, PyObject *callback, QObj return it.value().get(); } +void SignalManager::purgeEmptyGlobalReceivers() +{ + m_d->purgeEmptyGlobalReceivers(); +} + void SignalManager::notifyGlobalReceiver(QObject *receiver) { reinterpret_cast<GlobalReceiverV2 *>(receiver)->notify(); - m_d->purgeEmptyGlobalReceivers(); + purgeEmptyGlobalReceivers(); } void SignalManager::releaseGlobalReceiver(const QObject *source, QObject *receiver) diff --git a/sources/pyside6/libpyside/signalmanager.h b/sources/pyside6/libpyside/signalmanager.h index 684a4e5e7..c531d6630 100644 --- a/sources/pyside6/libpyside/signalmanager.h +++ b/sources/pyside6/libpyside/signalmanager.h @@ -78,6 +78,7 @@ public: // Disconnect all signals managed by Globalreceiver void clear(); + void purgeEmptyGlobalReceivers(); // Utility function to call a python method usign args received in qt_metacall static int callPythonMetaMethod(const QMetaMethod& method, void** args, PyObject* obj, bool isShortCuit); |