至少有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()
,指向發送信號的對象的指針。
編輯
正如doc說:
連接到一個對象的信號斷開一切
所以在下面的例子中這兩個窗口將顯示:
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");
'的QObject ::斷開();'http://doc.qt.io/qt-5/qobject.html#disconnect-5 – drescherjm
@drescherjm那文檔狀態'從接收方的方法中斷開此對象中的所有信號.'我正在讀取它,因爲它將所有**對象的信號從其他**對象的插槽中斷開,但我仍然不確定它是否也是斷開**這個**對象的插槽中的其他**對象的信號。 – Troyseph