New Immissions/Updates:
boundless - educate - edutalab - empatico - es-ebooks - es16 - fr16 - fsfiles - hesperian - solidaria - wikipediaforschools
- wikipediaforschoolses - wikipediaforschoolsfr - wikipediaforschoolspt - worldmap -

See also: Liber Liber - Libro Parlato - Liber Musica  - Manuzio -  Liber Liber ISO Files - Alphabetical Order - Multivolume ZIP Complete Archive - PDF Files - OGG Music Files -

PROJECT GUTENBERG HTML: Volume I - Volume II - Volume III - Volume IV - Volume V - Volume VI - Volume VII - Volume VIII - Volume IX

Ascolta ""Volevo solo fare un audiolibro"" su Spreaker.
CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Signal-Slot-Konzept - Wikipedia

Signal-Slot-Konzept

aus Wikipedia, der freien Enzyklopädie

Signale und Slots sind ein Konzept aus der Programmierung. Sie realisieren einen ereignisgesteuerten Programmfluss beziehungsweise eine ereignisgesteuerte Kommunikation zwischen Programmobjekten. Ursprünglich geprägt wurde der Begriff durch die Bibliothek Qt, wird aber mittlerweile auch von einer Reihe anderer Programmbibliotheken genutzt. Das Konzept lässt sich als spezielle Form des Beobachterprinzips betrachten und stellt eine Alternative zu den häufiger verwendeten Rückruffunktionen (engl. Callbacks) dar.

Das Signal-Slot-Konzept ist insbesondere in der Programmiersprache C++ verbreitet. Hier kann durch konzeptionell einfachere Rückrufmechanismen oftmals keine ausreichende Flexibilität erreicht werden, ohne dabei das Paradigma der starken Typsicherheit zu verletzen.

Inhaltsverzeichnis

[Bearbeiten] Überblick

Signale sind „Botschaften“, die bei Eintreten eines Ereignisses abgegeben werden (emittiert). Ein Slot ist prinzipiell eine normale 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 die selbe Funktion bei Auftreten unterschiedlicher Ereignisse aufgerufen wird.

Besonders häufig finden sich Signal-Slot-Mechanismen in Programmbibliotheken zur Erstellung graphischer Benutzeroberflächen. Hier erfüllen sie die Aufgabe, Objekte, insbesondere Widgets miteinander zu verknüpfen und so die Kontrollelemente der Oberfläche wie Schaltflächen und Listenfelder mit Funktionalität zu füllen.

Die C++-Bibliothek Qt 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 signal, slot und emit, die beim Kompilieren von dem Programm „Meta Object Compiler“ (moc) in einer Vorkompilierung aufgelöst werden.

Weiterhin gibt es verschiedene Programmbibliotheken, welche Signal-Slot-Mechanismen mittels generischer Programmierung (Templates) und Funktoren realisieren, wie die Bibliothek Boost oder libsigc++, eine Signal-Slot-Bibliothek welche beispielsweise von der gtkmm-Bibliothek verwendet wird.

[Bearbeiten] Vor- und Nachteile

Signale und Slots sind bei Einhaltung der Typsicherheit einfacher und flexibler zu verwenden als Callbacks, allerdings geht dies wegen des Overheads geringfügig auf Kosten der Geschwindigkeit. Der Unterschied ist jedoch in der Praxis kaum relevant.

Die Syntax von Signalen und Slots kann oftmals einfacher erscheinen als die für Callbacks beziehungsweise Methodenzeiger notwendige.

[Bearbeiten] Beispiele mit Qt

Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf bitte mit ihn zu verbessern und entferne anschließend diese Markierung.


[Bearbeiten] Vordefinierte Signale und Slots

Bei 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.

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    :   QMainWindow(parent, flags)
{
        ui.setupUi(this);

        QWidget* w = new QWidget();
        QCheckBox* c = new QCheckBox("Text", this);

        connect(c, SIGNAL(clicked(bool)), w, SLOT(setVisible(bool)));
}

Zu sehen ist der Konstruktor des Hauptfensters. Die Zeile ui.setupUi(this); dient zur Generierung des UIs und sei hier nicht näher erläutert (siehe Qt-Dokumentation). Die folgenden zwei Zeilen dienen der Erstellung eines leeren Fenster-Widgets w und eines mit „Text“ beschrifteten Checkbox-Widgets c, das im Hauptfenster erscheint.

Anschließend wird mittels connect die Verbindung beider Objekte erreicht. Als Signal dient das clicked-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 boolescher Parameter mit übergeben. setVisible ist ein Slot, über den bei allen Widgets gesteuert werden kann, ob es sichtbar ist oder nicht. signal und slots sind Qt-eigene Schlüsselwörter, um Signale und Slots als solche zu kennzeichnen.

Nach dem Start des Programmes würde nun das zweite Fenster bei jedem Klick auf die Checkbox jeweils erscheinen oder verschwinden.

[Bearbeiten] Selbsterstellte Signale und Slots

Eine einfache Klasse, die einen Wert speichert und zwei Funktionen anbietet um diesen zu verändern oder auszulesen:

class Zahl
{
private:
    int wert;
   
public:
    Zahl() : wert(0) {}

    int wert() const { return wert; }

    void setzeWert(int wert)
    {
        if(wert!=this->wert)
            this->wert=wert;
    }
};

Die selbe Klasse mit Signals und Slots:

#include <QObject>

class Zahl : public QObject
{
    Q_OBJECT

private:
    int wert;
   
public:
    Zahl() : wert(0) {}

    int wert() const { return wert; }

public slots:
    void setzeWert(int wert)
    {
        if(wert!=this->wert)
        {
            this->wert=wert;
            emit wertGeaendert(wert);
        }
    }
 
signals:
    void wertGeaendert(int neuerWert);
};

Verwendung der Klasse in einem Programm:

Zahl a, b;           // a.wert() == 0, b.wert() == 0

a.setzeWert(5);      // a.wert() == 5, b.wert() == 0
b.setzeWert(48);     // a.wert() == 5, b.wert() == 48

QObject::connect(&a, SIGNAL(wertGeaendert(int)), &b, SLOT(setzeWert(int)));

a.setzeWert(12);     // a.wert() == 12, b.wert() == 12
b.setzeWert(23);     // a.wert() == 12, b.wert() == 23

[Bearbeiten] Weblinks

Andere Sprachen

Static Wikipedia (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu