From: Manuel Nickschas Date: Tue, 18 Sep 2007 14:35:01 +0000 (+0000) Subject: Make SignalProxy detach QObjects automatically upon their destruction. X-Git-Tag: 0.1.0~156 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=da3abc60f84c44422242d59fadb1d2fa8fd49221 Make SignalProxy detach QObjects automatically upon their destruction. --- 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: