C++ 是否可以断开所有QObject';s连接而不删除它
我有一个QoObject a,它连接到另一个QoObject B。现在我希望a连接到C,第三个QoObject,并与B完全断开连接 轻松点!问题是我有很多a,每个a都有自己的一组信号和插槽(B/C更通用)。到目前为止,我一直在为每种不同的类类型手动创建连接和断开连接方法。这些方法基本上是彼此的副本,将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) {
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
。回答不错,断开所有连接
断开传入和传出连接吗?因此,这会断开所有传出连接,但不会断开传入连接,这一点更为重要。