Qt für C++ Anfänger: Signale und Slots
Aus Wikibooks
Signale und Slots sind ein Mechanismus von Qt wie sich verschiedene GUI Elemente oder Aktionen unterhalten können. Jemand sendet ein Signal aus und ein anderer empfängt diesen. Ein Signal kann z.B. beim drücken eines Buttons ausgesendet werden. Ein oder mehrere Empfänger, die so genannten Slots, empfangen den Signal und rufen daraufhin eine entsprechende Funktion auf, die z.B. irgendeine Berechung startet. Als erstes müssen wir uns überlegen wie man Signale und Slots miteinander verbindet.
connect(Calculate, SIGNAL(clicked()), this, SLOT(addAB()));
Diese Verbindung wird über das connect-Statement hergestellt. connect ist dabei ein Qt spezifisches Makro, welches vom Präprozessor in echtes C++ umgesetzt wird. Die Syntax sieht wie folgt aus:
Calculate: ist das Qt Objekt das ein Signal aussendet. Calculate ist der QPushButton, den Namen hatten wir im Qt Designer festgelegt.
SIGNAL(clicked()): Bezeichnet das Signal welches abgefangen werden soll. Objekte können unterschiedliche Signale aussenden. In der Qt-Dokumentation können die für das jeweiligen Qt-Objekt verfügbaren Signale nachgeschlagen werden.
this:
SLOT(addAB()): Bezeichnet die Funktion, die aufgerufen werden soll. Für diese Funktion muss natürlich wie für jede C++ Funktion auch ein Deklaration erstellt werden.
Wie man sich bereits denken kann, muss dieser connect-Befehl im Konstruktor unserer Klasse stehen. Die Deklaration des Slots addAB() findet im Headerfile statt. Das Headerfile sieht damit folgendermaßen aus:
//--- Taschenrechner.h - start ---
#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H
#include "ui_Taschenrechner.h"
class Taschenrechner : public QMainWindow, public Ui::MainWindow {
Q_OBJECT
public:
Taschenrechner(QMainWindow *parent = 0);
~Taschenrechner();
private slots:
void addAB();
};
#endif //TASCHENRECHNER_H
//--- Taschenrechner.h - end ---
Wie man sieht findet die Deklaration der Funktion addAB() innerhalb der Klasse statt. Es handelt sich also um eine Memberfunktion. Es wird noch angegeben, dass es sich um eine private Funktion handelt. Zum Schluss wird noch über ein Makro gesagt, dass es sich um ein Slot handelt. Die Datei Taschenrechner.cpp mit der eigentlichen Implementation sieht dann so aus:
//--- Taschenrechner.cpp - start ---
#include "Taschenrechner.h"
Taschenrechner::Taschenrechner(QMainWindow *parent) : QMainWindow(parent) {
setupUi(this);
InputA -> setText("0");
InputB -> setText("0");
connect(Calculate, SIGNAL(clicked()), this, SLOT(addAB()));
}
Taschenrechner::~Taschenrechner() { }
void Taschenrechner::addAB() {
//Hier wird im nächsten Kapitel die Funktion implementiert
}
//--- Taschenrechner.cpp - end ---
Alle Slots und Funktionen, die wir benötigen, werden also einfach in unserer Datei Taschenrechner.cpp nacheinander aufgelistet.
Wenn man das Programm nun übersetzt und ausführt, wird man erstmal keine Veränderung feststellen, da die Funktion addAB() noch leer ist. Als letztes sei noch angemerkt, dass die Funktion addAB() keinen Wert zurückgibt. Ein Rückgabewert schadet nicht, man kann sich die Tipparbeit aber sparen. Nur wenn es mehrere Ausstiege aus der Funktion, z.B. in Schleifen, gibt muss ein return verwendet werden.

