001
30.11.2004, 20:07 Uhr
typecast
aka loddab (Operator)
|
Jaein. Also ganz so ist es nicht. Signale haben keinen Rueckgabewert, sondern nur Parameter.
C++: |
class foo : public QObject { Q_OBJECT public: foo() { } void sendSignal() { emit mySignal(10); } signals: void mySignal(int); };
|
Das hier ist eine Klasse, die beim aufrufen der Funktion sendSignal() das Signal mySignal emitiert. Als Parameter wird 10 uebergeben. Die Klasse ist vollstaendig, d.h ein Signal wird nicht implementiert (und kann somit nichts zurueckgeben).
C++: |
class bar : public Qbject { Q_OBJECT public: bar() { f = new foo(); connect (f, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); } ~bar() { delete f; } public slots: void mySlot(int a) { std::cout << a << std::endl; } protected: foo f; };
|
Diese Klasse hier hat einen Slot, der ein int akzeptiert. Das entscheidende ist das connect: Es sorgt dafuer (zusammen mit dem moc precompiler), dass wenn das Signal mySignal emitiert wird, die Mehtode mySlot aufgerufen wird. Als Parameter wird dann quasi das Uebergeben, was dem Signal als Parameter mitgegeben wurde.
Das Signal ist im Grunde genommen nur eine bequeme Schnittstelle fuer das ansprechen der Slots. Der Programmierer der Klasse stellt ein Signal zur Verfuegung und sorgt dafuer, dass alle anderen Klassen von einem Ereignis informiert werden, indem er ein Signal erzeugt. -- All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925) |