Weil das hier ein wenig durcheinander geworfen wird:
signal/slot != event (auf API-Ebene)
In Qt existieren mit dem Signal/Slot-Mechanismus und dem Eventsystem 2 Benachrichtigungsysteme auf API-Ebene. Theoretisch würde man mit Verrenkungen auch mit einem der beiden auskommen. Bedenkt man allerdings die Herkunft Qts von C++ und das Fehlen von Objektbenachrichtigungen (auf diesen Teil der OOP-Spezifikation von Smalltalk reagieren C++-Leute allergisch, wohl aus Neid
) so ist der Signal-Slot-Mechanismus ein möglicher Weg, wenn vielleicht auch unelegant umgesetzt (Die Qt-Leute wurden ziemlich heftig gescholten für die Makroverrenkungen des MOC-Aufsatzes.) Auf API-Ebene ist das ganze dann schön einfach gehalten, wie überhaupt Qt durch eine simple und trotzdem mächtige API in C++ glänzt (Beispiel: threading unter C++).
Wann brauche ich nun Signal/Slots und wann Eventhandling?
Das ist zum einen eine Frage des Gustos (wie gesagt lassen sich beide mit Verrenkungen für quasi alles nutzen), der Vorgabe der Qt-API (bestimmte Ereignisse werden von Qt schon als Signal oder Event bereitgestellt) also auch des Einsatzzweckes. Generell würde ich nicht gegen die API programmieren, d.h. Ereignisse, die als Signal vorliegen, würde ich so weiternutzen etc. Zum Einsatzzweck liesse sich sagen, dass ein Event eher als "Rundmail" (besser Kettenmail) zu verstehen ist, also etwas, was prinzipiell alle Objekte angehen könnte während ein Signal dedizierte Empfänger hat. Ein Event durchläuft hierbei die Objekthierarchie und kann an entsprechender Stelle abgefangen, umgeleitet, ignoriert oder in irgendeiner Weise abgearbeitet werden. Wichtig hierbei ist, dass man die weitere Auslieferung des Events in der Hierarchie beeinflussen kann. (Das geht für Signale nicht in der Form, hier stehen die Empfänger gleichwertig nebeneinander.) Beispiele für solche Events sind Tasten/Mouse-Events oder Darstellungsbelange wie "Neuzeichnen" oder "Größenänderung".
In der Regel braucht man als API-Benutzer nur den Signal-Ansatz für Objekt-zu-Objekt-Benachrichtigungen und den Eventweg zum Behandeln von bestimmten von Qt bereitgestellten Events, die man als Eventhandler umsetzt. Das Erstellen eigener Events wird erst dann interessant, wenn man ein eigenes Toolkit mit Qt bauen möchte und auf die Routing-Funktion des Eventsystems angewiesen ist.