C++ 是否可以断开所有QObject';s连接而不删除它

C++ 是否可以断开所有QObject';s连接而不删除它,c++,qt,qobject,qmetaobject,C++,Qt,Qobject,Qmetaobject,我有一个QoObject a,它连接到另一个QoObject B。现在我希望a连接到C,第三个QoObject,并与B完全断开连接 轻松点!问题是我有很多a,每个a都有自己的一组信号和插槽(B/C更通用)。到目前为止,我一直在为每种不同的类类型手动创建连接和断开连接方法。这些方法基本上是彼此的副本,将connect交换为disconnect调用,这违反了规则) 所以我的问题是:以下功能可能吗 void deleteAllConnections(QObject* someObject) {

我有一个QoObject a,它连接到另一个QoObject B。现在我希望a连接到C,第三个QoObject,并与B完全断开连接

轻松点!问题是我有很多a,每个a都有自己的一组信号和插槽(B/C更通用)。到目前为止,我一直在为每种不同的类类型手动创建连接和断开连接方法。这些方法基本上是彼此的副本,将
connect
交换为
disconnect
调用,这违反了规则)

所以我的问题是:以下功能可能吗

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

我在文档中到处翻找,但运气不佳(尽管这通常不是保证…。

至少有两种方法。首先,断开所有连接

disconnect(obj,0,0,0);
//or
obj->disconnect();
第二。每个
connect()
都返回可以复制或移动的连接,因此您可以在列表中保存一些连接,一段时间后,只需在列表中迭代并为每个对象调用
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->断开(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");
QList连接;
QWidget*a=新的QWidget;
QWidget*b=新的QWidget;
a->setWindowTitle(“a”);
b->setWindowTitle(“b”);
连接setObjectName(“B”);

QObject::disconnect()
@drescherjm,文档中指出,
将此对象中的所有信号与接收器的方法断开。
我读到这一点,因为它将此对象的所有信号与其他对象的插槽断开,但我仍然不确定它是否也将其他对象的信号与此对象的插槽断开。这是我的解决方案,只需保留对以前发件人的引用,并在需要时致电
disconnect
。回答不错,
断开所有连接
断开传入和传出连接吗?因此,这会断开所有传出连接,但不会断开传入连接,这一点更为重要。