From da3abc60f84c44422242d59fadb1d2fa8fd49221 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 18 Sep 2007 14:35:01 +0000 Subject: [PATCH] Make SignalProxy detach QObjects automatically upon their destruction. --- src/common/signalproxy.cpp | 8 +++++++- src/common/signalproxy.h | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index c35ccb5e..763daf61 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -31,6 +31,7 @@ SignalProxy::SignalProxy(ProxyType _type, QIODevice *dev, QObject *parent) : QOb } SignalProxy::~SignalProxy() { + //qDebug() << "peers:" << peers.count(); foreach(Connection conn, peers) { conn.peer->deleteLater(); conn.device->deleteLater(); } @@ -71,14 +72,19 @@ void SignalProxy::socketDisconnected() { } void SignalProxy::attachSignal(QObject* sender, const char* signal, const QByteArray& rpcFunction) { + disconnect(sender, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *))); + connect(sender, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *))); + foreach(Connection conn, peers) { conn.peer->attachSignal(sender, signal, rpcFunction); } attachedSignals.append(SignalDesc(sender, signal, rpcFunction)); - } void SignalProxy::attachSlot(const QByteArray& rpcFunction, QObject* recv, const char* slot) { + disconnect(recv, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *))); + connect(recv, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *))); + foreach(Connection conn, peers) { conn.peer->attachSlot(rpcFunction, recv, slot); } diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index ed8b46b0..cb1fcbf0 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -37,14 +37,14 @@ class SignalProxy : public QObject { void attachSignal(QObject* sender, const char* signal, const QByteArray& rpcFunction = QByteArray()); void attachSlot(const QByteArray& rpcFunction, QObject* recv, const char* slot); - void detachObject(QObject* obj); - public slots: void addPeer(QIODevice *device); void sendSignal(const char *signal, QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(), QVariant p4 = QVariant(), QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant(), QVariant p8 = QVariant(), QVariant p9 = QVariant()); + void detachObject(QObject* obj); + //void detachSender(); signals: -- 2.20.1