¿Qt elimina automáticamente las conexiones entre objetos cuando se elimina uno de los lados?

Por ejemplo, connect (A .. , B ..), cuando se borra A (un puntero) o se borra B, ¿se desconectará la conexión?

¿Es necesario utilizar desconectar explícitamente en destructor?

54
daisy 13 may. 2012 a las 13:59

1 respuesta

La mejor respuesta

Sí, el destructor QObject::~QObject se encarga de eso:

Todas las señales hacia y desde el objeto se desconectan automáticamente y todos los eventos publicados pendientes para el objeto se eliminan de la cola de eventos.
Sin embargo, a menudo es más seguro utilizar deleteLater() en lugar de eliminar una subclase de QObject directamente.

Pero ten cuidado:

Advertencia: eliminar un QObject mientras hay eventos pendientes a la espera de ser entregados puede provocar un bloqueo. No debe eliminar el QObject directamente si existe en un hilo diferente al que se está ejecutando actualmente. Use deleteLater () en su lugar, lo que hará que el bucle de eventos elimine el objeto después de que se le hayan entregado todos los eventos pendientes.

50
Mat 13 may. 2012 a las 14:02
También tenga en cuenta esto: "Advertencia: Eliminar un QObject mientras los eventos pendientes están esperando ser entregados puede causar un bloqueo". Utilice deleteLater() si esta situación pudiera ocurrir.
 – 
user824425
13 may. 2012 a las 14:04
9
También tenga cuidado con las lambdas (si usa alguna) en el objeto eliminado: NO están desconectadas ... adivina cómo lo sé;)
 – 
mBardos
4 ago. 2015 a las 17:29
Esto también es cierto en Qt5.
 – 
RegularlyScheduledProgramming
24 may. 2016 a las 00:04
5
Desde Qt 5.2 hay una sobrecarga que toma un objeto de contexto. La conexión a la lambda se desconectará cuando se elimine el objeto de contexto.
 – 
Zitrax
10 ago. 2017 a las 17:28
Todavía estoy en 5.1.1, pero puedo decir una cosa: ¡era necesario! ;)
 – 
mBardos
11 ago. 2017 a las 10:08