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