From 22b1e53d440264813888d9d741d0bce6b67a8434 Mon Sep 17 00:00:00 2001 From: peri4 Date: Thu, 26 Jan 2023 23:56:39 +0300 Subject: [PATCH] PIQCONNECT, QPICONNECT and PIQCONNECT_QUEUED now automatic disconnects on target object delete PIQCONNECT[_QUEUED] now returns PIObject::Connection --- libs/piqt/piqt_macros.h | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/libs/piqt/piqt_macros.h b/libs/piqt/piqt_macros.h index 7704849..d9f59a7 100644 --- a/libs/piqt/piqt_macros.h +++ b/libs/piqt/piqt_macros.h @@ -61,27 +61,36 @@ QArgument qargument(const T & v) { } template -void piqConnect(PIObject * source, const char * event, void (*func)(void *, ARGS...), O * target, SR (O::*slot)(ARGS...)) { - PIObject::piConnectLS(source, - PIStringAscii(event), - PIObject::__newFunctor(func, [target, slot](ARGS... args) { (target->*slot)(args...); }), - LOCATION); +PIObject::Connection piqConnect(PIObject * source, const char * event, void (*func)(void *, ARGS...), O * target, SR (O::*slot)(ARGS...)) { + PIObject::Connection ret = + PIObject::piConnectLS(source, + PIStringAscii(event), + PIObject::__newFunctor(func, [target, slot](ARGS... args) { (target->*slot)(args...); }), + LOCATION); + QObject::connect(target, &QObject::destroyed, [ret]() { ret.disconnect(); }); + return ret; } template -void piqConnectQ(PIObject * source, const char * event, void (*func)(void *, ARGS...), QObject * target, const char * slot) { - PIObject::piConnectLS(source, - PIStringAscii(event), - PIObject::__newFunctor(func, - [target, slot](ARGS... args) { - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, qargument(args)...); - }), - LOCATION); +PIObject::Connection +piqConnectQ(PIObject * source, const char * event, void (*func)(void *, ARGS...), QObject * target, const char * slot) { + PIObject::Connection ret = + PIObject::piConnectLS(source, + PIStringAscii(event), + PIObject::__newFunctor(func, + [target, slot](ARGS... args) { + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, qargument(args)...); + }), + LOCATION); + QObject::connect(target, &QObject::destroyed, [ret]() { ret.disconnect(); }); + return ret; } template QMetaObject::Connection qpiConnect(O * source, SR (O::*signal)(ARGS...), PIObject * target, void (*handler)(void *, ARGS...)) { - return QObject::connect(source, signal, source, [target, handler](ARGS... args) { handler(target, args...); }); + auto ret = QObject::connect(source, signal, source, [target, handler](ARGS... args) { handler(target, args...); }); + CONNECTL(target, deleted, [ret](PIObject *) { QObject::disconnect(ret); }); + return ret; } } // namespace PIQt