<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Signal-Slot-Konzept</id>
	<title>Signal-Slot-Konzept - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Signal-Slot-Konzept"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Signal-Slot-Konzept&amp;action=history"/>
	<updated>2026-06-08T15:50:04Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Signal-Slot-Konzept&amp;diff=519719&amp;oldid=prev</id>
		<title>imported&gt;Siegbert v2: Boost Weblinks sind oppelt vorhanden; es reicht einmalige Erwähnung unter Implementierungen</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Signal-Slot-Konzept&amp;diff=519719&amp;oldid=prev"/>
		<updated>2026-04-04T14:40:30Z</updated>

		<summary type="html">&lt;p&gt;Boost Weblinks sind oppelt vorhanden; es reicht einmalige Erwähnung unter Implementierungen&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Signale und Slots&amp;#039;&amp;#039;&amp;#039; sind ein Konzept aus der [[Programmierung]]. Sie realisieren einen [[Ereignis (Programmierung)|ereignis]]gesteuerten [[Programmfluss]] beziehungsweise eine ereignisgesteuerte Kommunikation zwischen [[Objekt (Programmierung)|Programmobjekten]]. Ursprünglich geprägt wurde der Begriff durch die [[Qt (Bibliothek)|Bibliothek Qt]], wird aber mittlerweile auch von einer Reihe anderer [[Programmbibliothek]]en genutzt. Das Konzept lässt sich als Anwendung des Entwurfsmusters [[Beobachter (Entwurfsmuster)|&amp;#039;&amp;#039;Beobachter&amp;#039;&amp;#039;]] betrachten. Es wird als Alternative zu direkten [[Rückruffunktion]]en (engl. &amp;#039;&amp;#039;Callbacks&amp;#039;&amp;#039;) eingesetzt, wenn sich diese als zu unflexibel oder nicht [[Starke Typisierung|typsicher]] erweisen (z.&amp;amp;nbsp;B. bei der Entwicklung komplexer [[Anwendungssoftware|grafischer Anwendungen]]).&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Signale&amp;#039;&amp;#039; sind „Botschaften“, die bei Eintreten eines Ereignisses abgegeben werden (&amp;#039;&amp;#039;emittiert&amp;#039;&amp;#039;). Ein &amp;#039;&amp;#039;Slot&amp;#039;&amp;#039; ist prinzipiell eine normale [[Unterprogramm|Funktion]], die auf eine bestimmte Weise mit einem Signal verknüpft werden kann. Slots und Signale „wissen“ zunächst nichts voneinander. Erst durch die Verknüpfung entsteht die eigentliche Programmlogik: Jedes Mal, wenn das Signal abgegeben wird, wird anschließend der verbundene Slot aufgerufen. Ein Signal kann auch mit mehreren Slots verbunden werden, so dass bei Eintreten eines Ereignisses mehrere Funktionen aufgerufen werden. Ebenso kann ein Slot mit mehreren Signalen verbunden werden, wodurch dieselbe Funktion bei Auftreten unterschiedlicher Ereignisse aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Besonders häufig finden sich Signal-Slot-Mechanismen in Programmbibliotheken zur Erstellung [[Grafische Benutzeroberfläche|grafischer Benutzeroberflächen]]. Hier erfüllen sie die Aufgabe, [[Objekt (Programmierung)|Objekte]], insbesondere [[Steuerelement|Steuerelemente]] miteinander zu verknüpfen und so die Kontrollelemente der Oberfläche wie [[Schaltfläche]]n und [[Listenfeld]]er mit Funktionalität zu füllen.&lt;br /&gt;
&lt;br /&gt;
Die [[C++]]-Bibliothek &amp;#039;&amp;#039;Qt&amp;#039;&amp;#039; ist wohl das bekannteste Beispiel für die Verwendung von Signalen und Slots. Realisiert werden sie dort durch neu in C++ eingeführte Schlüsselwörter wie &amp;#039;&amp;#039;signal&amp;#039;&amp;#039;, &amp;#039;&amp;#039;slot&amp;#039;&amp;#039; und &amp;#039;&amp;#039;emit&amp;#039;&amp;#039;, die, bevor sie durch den C++-Präprozessor entfernt werden, dem Qt-eigenen „Meta Object Compiler“ (&amp;#039;&amp;#039;moc&amp;#039;&amp;#039;) bei der Erstellung weiteren C++-Codes helfen.&lt;br /&gt;
&lt;br /&gt;
Weiterhin gibt es verschiedene Programmbibliotheken, welche Signal-Slot-Mechanismen mittels [[generische Programmierung|generischer Programmierung]] ([[Template (C++)|Template]]s) und [[Funktor (Informatik)|Funktor]]en realisieren, wie die Bibliothek [[Boost (C++-Bibliothek)|Boost]] oder [[libsigc++]], eine Signal-Slot-Bibliothek, welche beispielsweise von der [[gtkmm]]-Bibliothek verwendet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
Signale und Slots sind bei Einhaltung der Typsicherheit einfacher und flexibler zu verwenden als &amp;#039;&amp;#039;Callbacks&amp;#039;&amp;#039;, allerdings geht dies wegen des Overheads geringfügig auf Kosten der Geschwindigkeit. Der Unterschied ist jedoch in der Praxis kaum relevant.&lt;br /&gt;
&lt;br /&gt;
Die [[Syntax]] von Signalen und Slots kann oftmals einfacher erscheinen als die für Callbacks beziehungsweise [[Methodenzeiger]] notwendige.&lt;br /&gt;
&lt;br /&gt;
== Beispiele mit Qt ==&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Signale und Slots ===&lt;br /&gt;
&lt;br /&gt;
Bei [[Qt (Bibliothek)|Qt]] verfügen viele mitgelieferte Klassen bereits über diverse vordefinierte Signale und Slots, die man verwenden kann. Im folgenden Beispiel soll gezeigt werden, wie man diese benutzen kann, um Basisfunktionalitäten in ein [[GUI]] zu programmieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;#include &amp;lt;QCheckBox&amp;gt;&lt;br /&gt;
#include &amp;lt;QObject&amp;gt;&lt;br /&gt;
#include &amp;lt;QMainWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;QWidget&amp;gt;&lt;br /&gt;
#include &amp;lt;Qt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow: QMainWindow {&lt;br /&gt;
private:&lt;br /&gt;
    QWidget w;&lt;br /&gt;
    QCheckBox c(&amp;quot;Fenster sichtbar&amp;quot;, this);&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    MainWindow(QWidget *parent, Qt::WindowFlags flags): QMainWindow(parent, flags) {&lt;br /&gt;
        ui.setupUi(this);&lt;br /&gt;
        connect(&amp;amp;c, SIGNAL(clicked(bool)), &amp;amp;w, SLOT(setVisible(bool)));&lt;br /&gt;
    }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu sehen ist der [[Konstruktor]] des Hauptfensters. Die Zeile &amp;lt;code&amp;gt;ui.setupUi(this);&amp;lt;/code&amp;gt; dient zur Generierung der Benutzeroberfläche und sei hier nicht näher erläutert (siehe Qt-Dokumentation). Die folgenden zwei Zeilen dienen der Erstellung eines leeren [[Fenster (Computer)|Fenster]]-Widgets &amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt; und eines mit dem Text „Fenster sichtbar“ beschrifteten [[Checkbox]]-Widgets &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, das im Hauptfenster erscheint.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird mittels &amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt; die Verbindung beider Objekte erreicht. Als Signal dient das &amp;lt;code&amp;gt;clicked&amp;lt;/code&amp;gt;-Signal der Checkbox, das dann abgegeben wird, wenn der Benutzer die Box anklickt. Der Status nach dem Anklicken, also ob die Box angekreuzt ist oder nicht, wird als [[Boolesche Variable|boolescher Parameter]] mit übergeben. &amp;lt;code&amp;gt;setVisible&amp;lt;/code&amp;gt; ist ein Slot, über den bei allen Widgets gesteuert werden kann, ob es sichtbar ist oder nicht. &amp;lt;code&amp;gt;SIGNAL&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;SLOT&amp;lt;/code&amp;gt; sind Qt-eigene Schlüsselwörter, um Signale und Slots als solche zu kennzeichnen; sie werden vom [[Qt (Bibliothek)#Meta-Object-Compiler|Meta-Object-Compiler]] erkannt.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start des Programmes würde nun das zweite, leere Fenster bei jedem Klick auf die Checkbox jeweils erscheinen oder verschwinden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für selbsterstellte Signale und Slots ===&lt;br /&gt;
&lt;br /&gt;
An einer einfachen Klasse wird gezeigt, wie Signale und Slots in der Qt-Bibliothek funktionieren. Die Klasse &amp;lt;code&amp;gt;Zahl&amp;lt;/code&amp;gt; speichert einen Wert und hat zwei Funktionen, um diesen Wert zu verändern oder auszulesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Number.h&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;QObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Number: QObject {&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    &lt;br /&gt;
private:&lt;br /&gt;
    int value;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    Number(): value(0) { }&lt;br /&gt;
    &lt;br /&gt;
    int getValue() const {&lt;br /&gt;
        return value;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
slots:&lt;br /&gt;
    void setValue(int value) {&lt;br /&gt;
        if (value != this-&amp;gt;value) {&lt;br /&gt;
            this-&amp;gt;value = value;&lt;br /&gt;
            emit onChange(value);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
signals:&lt;br /&gt;
    void onChange(int newValue);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// main.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Number.h&amp;gt;&lt;br /&gt;
#include &amp;lt;QObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    Number a, b; // a.getValue() == 0, b.getValue() == 0&lt;br /&gt;
    &lt;br /&gt;
    a.setValue(5); // a.getValue() == 5, b.getValue() == 0&lt;br /&gt;
    b.setValue(48); // a.getValue() == 5, b.getValue() == 48&lt;br /&gt;
    &lt;br /&gt;
    QObject::connect(&amp;amp;a, SIGNAL(onChange(int)), &amp;amp;b, SLOT(setValue(int)));&lt;br /&gt;
    &lt;br /&gt;
    a.setValue(12); // a.getValue() == 12, b.getValue() == 12&lt;br /&gt;
    b.setValue(23); // a.getValue() == 12, b.getValue() == 23&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; wird aus der Klasse &amp;lt;code&amp;gt;QObject&amp;lt;/code&amp;gt; abgeleitet, die die notwendigen Funktionen für die Verwendung von Signalen und Slots enthält. &amp;lt;code&amp;gt;Q_OBJECT&amp;lt;/code&amp;gt; ist ein Makro, das in allen Klassen enthalten sein muss, in denen Signale oder Slots deklariert werden. Die Funktion &amp;lt;code&amp;gt;setValue()&amp;lt;/code&amp;gt; ist als Slot deklariert, d.&amp;amp;nbsp;h., sie kann mit Signalen wie &amp;lt;code&amp;gt;onChange()&amp;lt;/code&amp;gt; verbunden werden. Der Meta-Object-Compiler erzeugt aus dieser Deklaration der Klasse &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; zusätzlichen Quellcode, der Funktionen zur Verwendung der neu deklarierten Signale und Slots enthält. Für die Signale müssen vom Programmierer keine Funktionen mehr implementiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Signale mit &amp;lt;code&amp;gt;emit&amp;lt;/code&amp;gt; aktiviert werden, werden alle Slots, die während der Laufzeit des Programms mit diesem Signal verbunden wurden, aufgerufen. Diese Verbindung von Signalen und Slots geschieht mit &amp;lt;code&amp;gt;connect()&amp;lt;/code&amp;gt; (siehe zum besseren Verständnis Weblinks: Qt-Dokumentation zu Signals und Slots) und kann auch wieder aufgehoben werden. In &amp;lt;code&amp;gt;connect()&amp;lt;/code&amp;gt; wird auch geprüft, ob die angegebenen Signale und Slots existieren und ob die Typen der Parameter übereinstimmen. Die verbundenen Signale und Slots (jeweils die Instanz einer Klasse und eine Funktion) werden in einer Liste verwaltet. Einem Signal können beliebig viele Slots zugeordnet werden.&lt;br /&gt;
&lt;br /&gt;
In dem Beispiel erhalten die Instanzen &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; bei der Initialisierung den Wert 0. Mit &amp;lt;code&amp;gt;a.setValue(5);&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;b.setValue(48);&amp;lt;/code&amp;gt; wird der Wert von &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; geändert und jeweils das Signal &amp;lt;code&amp;gt;onChange()&amp;lt;/code&amp;gt; aktiviert. Da bei diesen ersten Aufrufen von &amp;lt;code&amp;gt;setValue()&amp;lt;/code&amp;gt; noch kein Slot mit den Signalen beider Instanzen verbunden ist, bewirkt die Aktivierung des Signals nichts. Erst nach dem Verbinden des Signals &amp;lt;code&amp;gt;a.onChange()&amp;lt;/code&amp;gt; mit dem Slot &amp;lt;code&amp;gt;b.setValue()&amp;lt;/code&amp;gt; mittels &amp;lt;code&amp;gt;connect()&amp;lt;/code&amp;gt; wird bei einer Änderung des Wertes von &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; auch die Funktion &amp;lt;code&amp;gt;b.setValue()&amp;lt;/code&amp;gt; aufgerufen und damit der Wert von &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; geändert. Der letzte Aufruf &amp;lt;code&amp;gt;b.setValue(23)&amp;lt;/code&amp;gt; hat keine Auswirkung auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, da mit dem Signal &amp;lt;code&amp;gt;b.onChange()&amp;lt;/code&amp;gt; kein Slot verbunden ist.&lt;br /&gt;
&lt;br /&gt;
== Implementierungen ==&lt;br /&gt;
&lt;br /&gt;
* das &amp;#039;&amp;#039;Signals und Slots&amp;#039;&amp;#039; - Modell von [[Qt (Bibliothek)|Qt]], einer C++ - Klassenbibliothek (zur plattformübergreifenden Oberflächenprogrammierung)&lt;br /&gt;
* C++: [https://www.boost.org/doc/libs/latest/doc/html/signals2.html Boost.Signals2] bzw. [https://www.boost.org/doc/libs/1_68_0/doc/html/signals.html Boost.Signals] (veraltet; verfügbar bis Version 1.68)&lt;br /&gt;
* C++: [[libsigc++]] - Template-basiert.&lt;br /&gt;
* C++: [http://sigslot.sourceforge.net/ sigslot]&lt;br /&gt;
* C++: [http://xlobject.sourceforge.net/ XLObject] - Template-basiert, Qt-orientiert.&lt;br /&gt;
* C++: [http://github.com/pbhogan/Signals Signals]&lt;br /&gt;
* C: [http://www.monkey.org/~provos/libevent/ libevent] - multi-threaded, plattformübergreifend.&lt;br /&gt;
* C: [http://software.schmorp.de/pkg/libev.html libev] - minimalistische Alternative zu libevent.&lt;br /&gt;
* [[JavaScript]]: [https://github.com/petsel/javascript-api-extensions/blob/master/core/SignalsAndSlots/EventTargetProvider.js EventTargetProvider.js], Sprachkern-basiert, typsicher.&lt;br /&gt;
* PHP: [http://flow.typo3.org/ TYPO3 Flow] - application framework mit Signal-Slot-Unterstützung&lt;br /&gt;
* Java: [https://github.com/retuxx/sig4j sig4j] - multi-threaded, typsicher, basiert auf der in Java 8 eingeführten [https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html FunctionalInterface] Annotation.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://doc.qt.io/qt-5/signalsandslots.html Qt-Dokumentation zu Signals und Slots] (engl.)&lt;br /&gt;
* {{Webarchiv | url=http://scottcollins.net/articles/a-deeper-look-at-signals-and-slots.html | wayback=20070703100120 | text=A Deeper Look at Signals and Slots}} (engl.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Siegbert v2</name></author>
	</entry>
</feed>