El mecanismo de signals y slots es fundamental para qt. Los Slots son muy similares a las funciones comunes, pueden ser virtuales, sobrecargados, privados, protegidos y públicos. Además pueden ser invocados como cualquier otra función de c++ y sus parámetros pueden ser de cualquier tipo. La diferencia con las funciones es que los Slots pueden ser invocados automáticamente desde una señal.
La conexión entre signal y slot es así:
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
Donde sender y receiver son objetos de tipo QObjects, además signal y slot se pasan como parámetro sin parámetros, solo el nombre de la función.
Una signal puede llamar a diferentes slots y un slot puede ser llamado por diferentes funciones. Veamos unos ejemplos:
Una signal puede llamar a diferentes slots:
connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));
Un slot es llamado por diferentes signal:
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));
Una signal puede conectar otra signal:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
Cuando la primera señal es emitida, la segunda es emitida.
Una conexión puede ser removida:
disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
Algo muy importante es que la signal y el slot o signal a la que es conectada debe tener la misma cantidad de parámetros y del mismo tipo. Si el slot o signal a la que es conectada tiene más parámetros, simplemente sera ignorados. Si los parámetros son de diferente tipo qt lanzara una advertencia cuando se compila y un error en tiempo de ejecución.
El mecanismo de signals y slots, no esta limitado a el diseño de interfaces de usuarios, también se puede usar en el modelado heredando de QObject.