Helmut Herold: Das Qt-Buch - Der millin Verlag
Helmut Herold: Das Qt-Buch - Der millin Verlag
Helmut Herold: Das Qt-Buch - Der millin Verlag
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
2 Grundlegende Konzepte und Konstrukte von <strong>Qt</strong><br />
2.2.3 Regeln für die Deklaration eigener Slots und Signale<br />
Hier werden nochmals wichtige Regeln, die beim Signal-Slot-Konzept gelten, zusammengefasst.<br />
Sie ergänzen die auf Seite 24 aufgeführte Liste.<br />
28<br />
1. Slots können wie jede andere C++-Methode deklariert und implementiert werden.<br />
Slots sind eigentlich Methoden, die auch wie diese außerhalb eines connect()-<br />
Aufrufs direkt aufgerufen werden können. Umgekehrt können Methoden nicht als<br />
Argument eines connect()-Aufrufs angegeben werden.<br />
2. Bei der Definition von Slots muss nur zuvor das Schlüsselwort slots zum entsprechenden<br />
Schutztyp-Schlüsselwort public bzw. private hinzugefügt werden. Natürlich<br />
ist es auch möglich, protected slots: zu definieren und diese alsbreak<br />
virtual zu deklarieren. Während Methoden auch static deklariert sein können,<br />
ist dies bei Slots nicht erlaubt.<br />
3. Slots können wie Methoden Parameter besitzen. Es ist dabei nur zu beachten, dass<br />
das bei einem connect()-Aufruf angegebene Signal die gleichen Parametertypen<br />
besitzt wie der entsprechende Slot. Ein Slot kann dabei jedoch auch weniger Parameter<br />
haben als das mit ihm verbundene Signal, wenn er diese vom Signal gelieferten<br />
Parameter nicht alle benötigt.<br />
4. Die Syntax für Slot-Namen entspricht der für Methoden. Einige Programmierer betten<br />
jedoch die Zeichenkette slot in den Namen von Slots ein, um diese sofort als<br />
Slots identifizieren zu können. Dieser Konvention folgt <strong>Qt</strong> bei den Namen seiner<br />
vordefinierten Slots jedoch nicht.<br />
5. Um Signale in einer Klasse zu definieren, muss zuvor das Schlüsselwort signals:<br />
angegeben werden. Andernfalls entspricht die Deklaration von Signalen der von anderen<br />
Memberfunktionen, mit einem wichtigen Unterschied, dass Signale nur deklariert<br />
und niemals direkt implementiert werden dürfen.<br />
6. Zum Senden eines Signals in einer Komponente steht das <strong>Qt</strong>-Schlüsselwort emit<br />
zur Verfügung. Wenn z. B. das Signal void farbe_geaendert(int) in der Klassendefinition<br />
deklariert wurde, wäre z. B. folgender Aufruf möglich:<br />
emit farbe_geaendert(173);<br />
7. Die Verbindung von Signalen und Slots erfolgt mit QObject::connect(). Diese<br />
Methode wird in überladenen Varianten angeboten, hier aber werden wir nur die<br />
statische Variante mit vier Parametern verwenden:<br />
QObject::connect( signal_object, // Objekt, das das Signal schickt<br />
SIGNAL(signal_name(...)), // Signal, das mit Slot zu verbinden<br />
slot_object, // Objekt, das Signal empfängt<br />
SLOT(slot_name(...)) ); // Slot, der mit Signal zu verbinden<br />
Es können sowohl eine beliebige Anzahl von Slots mit einem Signal als auch umgekehrt<br />
eine beliebige Anzahl von Signalen mit einem Slot verbunden werden. Da die<br />
Reihenfolge, in der Slots aufgerufen werden, bisher noch nicht von <strong>Qt</strong> festgelegt ist,<br />
kann man sich nicht darauf verlassen, dass Slots auch in der Reihenfolge aufgerufen<br />
werden, in der sie mittels connect() mit Signalen verbunden wurden.<br />
8. Bei den SIGNAL- und SLOT-Routinen sind immer nur Typen als Parameter erlaubt.<br />
Ein häufiger Fehler ist, dass hier versucht wird, einen Wert statt eines Typs anzugeben,<br />
wie z. B. im Folgenden, wo versucht wird, bei Auswahl des vierten Menüpunkts<br />
die Slotroutine quit() aufzurufen: