aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/pyside6/libpyside/signalmanager.cpp21
-rw-r--r--sources/pyside6/libpyside/signalmanager.h1
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);