custom - qt signals and slots tutorial
Qt Signals y Slot se conectaron dos veces... ¿qué ocurre? (3)
Hace unas semanas, tuvimos un interno conectando accidentalmente una señal a una ranura más de una vez. La idea era que bajo una condición, tuvieras la ranura conectada a la señal, y bajo otra condición la desconectarías. Cuando cambiaste de modo, harías el trabajo apropiado.
Bueno, olvidó desconectarse cuando correspondía. Entonces, cada vez que cambiabas de modo, tenías una nueva conexión a la ranura.
¿El final resulto? 1 conexión == 1 llamada a la ranura. 2 conexiones == 2 llamadas a la ranura. 3 conexiones == 3 llamadas a la ranura, etc. Estas llamadas se realizaron "simultáneamente" (sé que en realidad no lo hicieron, ya que están en la misma cadena de eventos, pero lo que quiero decir es que todas las llamadas se procesaron en sucesión).
Como señala @Job en uno de sus comentarios (merece crédito, así que no me Qt::UniqueConnection
a Qt::UniqueConnection
por su trabajo), Qt::UniqueConnection
evitará este problema.
¿Qué sucede si la misma señal y ranura están conectadas dos veces?
¿Cómo se maneja el mecanismo?
La ranura se ejecuta varias veces (como ya se dijo).
Algunas notas más:
- En tiempos pasados, el patrón para "conectar exactamente una vez" en los casos donde podría haber habido una conexión antes, era primero desconectarse y luego conectarse para imponer exactamente una conexión.
- Ahora, desde 4.6, también existe la Qt :: UniqueConnection más elegante, ver http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
Usualmente cosas malas. Es perfectamente aceptable conectar la ranura dos o más veces, pero cuando la señal se active, se llamará a su ranura para cada conexión que haya hecho, que probablemente no sea la que desea.
Tenga en cuenta que no es necesariamente incorrecto tener múltiples conexiones. Existen (probablemente) usos perfectamente válidos para ello. Son bastante raros, ciertamente no puedo pensar en ningún momento en que lo haya usado como característica. Todas las situaciones que recuerdo donde había una conexión múltiple resultaron ser un error en lugar de una intención.