05.12.2012 Aufrufe

Helmut Herold: Das Qt-Buch - Der millin Verlag

Helmut Herold: Das Qt-Buch - Der millin Verlag

Helmut Herold: Das Qt-Buch - Der millin Verlag

MEHR ANZEIGEN
WENIGER ANZEIGEN

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:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!