至少有两种方法。首先,断开所有连接。
disconnect(obj,0,0,0);
//or
obj->disconnect();
其次,每个connect()
函数都会返回一个QMetaObject::Connection
对象,该对象可以被复制或移动,因此您可以将一些连接保存在列表中,过一段时间后,只需遍历列表并为每个对象调用disconnect()
函数。以下是一个包含一个连接的示例:
QMetaObject::Connection m_connection
//…
m_connection = QObject::connect(…)
//…
QObject::disconnect(m_connection)
奖励:不,Qt不支持如此深入的内省,你无法获得所有连接的槽的列表或其他任何东西,但在大多数情况下,你根本不需要这个。 Qt 给你一个有用的函数是 sender()
,它是指向发送信号的对象的指针。
编辑
正如文档所说:
断开与对象的信号连接的所有内容
因此,在下一个示例中,两个窗口都将显示:
QWidget *a = new QWidget;
QWidget *b = new QWidget;
a->setWindowTitle("A");
b->setWindowTitle("B");
QObject::connect(a,SIGNAL(objectNameChanged(QString)), b, SLOT(show()));
QObject::connect(b,SIGNAL(objectNameChanged(QString)), a, SLOT(show()));
a->setObjectName("A");
b->setObjectName("B");
但是如果取消注释a->disconnect();
,那么只有A
窗口将被显示。这意味着文档中所述的QObject::connect(b,SIGNAL(objectNameChanged(QString)),a,SLOT(show()));
未被断开连接。如果要解决此难题,您可以执行a->disconnect(b); b->disconnect(a);
,但这当然是非常糟糕的方法。因此,您可以使用我回答中的第二个建议:
QList<QMetaObject::Connection> connections;
QWidget *a = new QWidget;
QWidget *b = new QWidget;
a->setWindowTitle("A");
b->setWindowTitle("B");
connections << QObject::connect(a,SIGNAL(objectNameChanged(QString)), b, SLOT(show()));
connections << QObject::connect(b,SIGNAL(objectNameChanged(QString)), a, SLOT(show()));
foreach (auto var, connections)
a->setObjectName("A");
b->setObjectName("B");
disconnect
。 - heLomaN