2015-08-20 37 views
15

我有一個QObject A,這是連接到另一個QObject B.現在我想A連接到C,第三個QObject並完全從B斷開連接。是否有可能斷開所有的QObject的連接而不刪除它

簡單易用!麻煩的是我有很多A的每一個都有自己的一套信號和插槽(B's/C更通用)。到目前爲止,我一直在爲每種不同的類類型手動進行連接和斷開連接。這些方法基本上是彼此的副本,交換connectdisconnect呼叫,與don't repeat yourself相反)。

所以我的問題是:下列功能可能嗎?

void deleteAllConnections(QObject* someObject) { 
    // TODO disconnect all connections owned by someObject 
    // For bonus points: Is there a way of accessing the QMetaObject connected to? 
} 

我在QMetaObjectQObjectSignals and Slots文件沒有運氣周圍戳(雖然這往往不能保證......)。

+0

'的QObject ::斷開();'http://doc.qt.io/qt-5/qobject.html#disconnect-5 – drescherjm

+0

@drescherjm那文檔狀態'從接收方的方法中斷開此對象中的所有信號.'我正在讀取它,因爲它將所有**對象的信號從其他**對象的插槽中斷開,但我仍然不確定它是否也是斷開**這個**對象的插槽中的其他**對象的信號。 – Troyseph

回答

33

至少有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"); 
+0

很好的答案,是否斷開所有連接斷開傳入和傳出連接? – Troyseph

+1

@SebastianTroy請參閱我編輯的答案。 – Chernobyl

相關問題