c++ - unidad - ¿Es posible desconectar todas las conexiones de un QObject sin borrarlo?
net use unidad de red (1)
Hay al menos 2 formas. Primero, desconecte todo.
disconnect(obj,0,0,0);
//or
obj->disconnect();
Segundo. Cada connect()
devuelve QMetaObject::Connection
que se puede copiar o mover, por lo que puede guardar algunas conexiones en la lista y, después de un tiempo, simplemente recorrer la lista y llamar a disconnect()
para cada objeto. Ejemplo con una conexión:
QMetaObject::Connection m_connection;
//…
m_connection = QObject::connect(…);
//…
QObject::disconnect(m_connection);
Bonificación: no, Qt no admite una introspección tan profunda, no puede obtener una lista de todas las ranuras conectadas u otra, pero en la mayoría de los casos, no necesita esto en absoluto. Una información útil, que Qt te da es sender()
, puntero al objeto que envió la señal.
Editar
Como dijo el doc :
Desconecta todo lo conectado a las señales de un objeto.
Así que en el siguiente ejemplo se mostrarán ambas ventanas:
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");
Pero descomentar a->disconnect();
y solo se mostrará A
ventana. Significa que QObject::connect(b,SIGNAL(objectNameChanged(QString)),a,SLOT(show()));
no fue desconectado como se indica en el doc. Si quieres resolver este acertijo, puedes hacer a->disconnect(b);b->disconnect(a);
, pero es, por supuesto, muy mal enfoque. Así que puedes usar la segunda sugerencia de mi respuesta:
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");
Tengo un QObject A, este está conectado a otro QObject B. Ahora quiero que A se conecte a C, un tercer QObject y que me desconecte completamente de B.
¡Pan comido! El problema es que tengo un montón de A cada uno con su propio conjunto de señales y ranuras (los B / C son más genéricos). Hasta ahora he estado haciendo manualmente un método de conexión y desconexión para cada tipo de clase diferente. Los métodos son básicamente copias entre sí intercambiando la connect
para disconnect
llamada, yendo en contra de no repetirse ).
Entonces mi pregunta es: ¿Es posible la siguiente función?
void deleteAllConnections(QObject* someObject) {
// TODO disconnect all connections owned by someObject
// For bonus points: Is there a way of accessing the QMetaObject connected to?
}
He QMetaObject en la documentación de QMetaObject , QObject y Signals and Slots sin suerte (aunque eso a menudo no es una garantía ...).