#ifndef WEAKCONNECT_H #define WEAKCONNECT_H #include // Qt includes #include template ::value, int> = 0> static inline QMetaObject::Connection weakConnect(typename QtPrivate::FunctionPointer::Object* sender, Func1 signal, typename QtPrivate::FunctionPointer::Object* receiver, Func2 slot) { QMetaObject::Connection conn_normal = QObject::connect(sender, signal, receiver, slot); QMetaObject::Connection* conn_delete = new QMetaObject::Connection(); *conn_delete = QObject::connect(sender, signal, [conn_normal, conn_delete]() { QObject::disconnect(conn_normal); QObject::disconnect(*conn_delete); delete conn_delete; }); return conn_normal; } template ::value, int> = 0> static inline QMetaObject::Connection weakConnect(typename QtPrivate::FunctionPointer::Object* sender, Func1 signal, Func2 slot) { QMetaObject::Connection conn_normal = QObject::connect(sender, signal, slot); QMetaObject::Connection* conn_delete = new QMetaObject::Connection(); *conn_delete = QObject::connect(sender, signal, [conn_normal, conn_delete]() { QObject::disconnect(conn_normal); QObject::disconnect(*conn_delete); delete conn_delete; }); return conn_normal; } template ::value, int> = 0> static inline QMetaObject::Connection weakConnect(typename QtPrivate::FunctionPointer::Object* sender, Func1 signal, typename QtPrivate::FunctionPointer::Object* receiver, Func2 slot) { Q_UNUSED(receiver); QMetaObject::Connection conn_normal = QObject::connect(sender, signal, slot); QMetaObject::Connection* conn_delete = new QMetaObject::Connection(); *conn_delete = QObject::connect(sender, signal, [conn_normal, conn_delete]() { QObject::disconnect(conn_normal); QObject::disconnect(*conn_delete); delete conn_delete; }); return conn_normal; } #endif // WEAKCONNECT_H