至少有2种方式。首先,断开一切。
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->disconnect();
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) {
QObject::disconnect(var);
}
a->setObjectName("A");
b->setObjectName("B");