Signal und Slots mit QT4

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Einführung in das Signal und Slot Konzept von QT4.
    Signal und Slots:

    Das "Signal und Slots" Konzept ist eines der wichtigsten Besonderheiten in QT.
    Man versteht darunter im Grunde genommen das diverse Widgets Signale senden können
    und die bei einen anderen Widget (oder auch dem gleichen) in einem sogenante Slots (Schnitstellen) aufgenommen werden, das heist wenn man beide mit einander verbunden hat.
    Dabei gilt das man ein jedes Signal grundsätzlich mit jedem Slot verbinden kann solange der Slot das Argument erwartet was das Signal sendet.
    Die meisten Widgets haben von Haus aus eine menge Signal und Slots vordefiniert, man kann aber auch ohne weiteres eigene Signal und Slots erstellen.

    Schauen wir uns zuerst einmal einen Einfache Signal und Slot verbindung an.
    Bei unseren Hello World Programm (aus der QT-Einführung) haben wir bereits Bekanntschaft mit diesem Konzept gehabt.

    Quellcode

    1. QObject::connect(&beenden, SIGNAL(clicked()), &app, SLOT(qu


    Hier haben wir das Signal "clicked()" mit dem Slot "quit()" verbunden.
    Das Signal clicked wird uns von Widget "QPushbutton" zu Verfügung gestellt und dem Slot vom "QApplication" Widget übergeben.
    Wenn man sich die diversen Signale und Slots der Widget anschauen möchte dann sollte man die QT-Dokumentation benutzen.
    Beim Verbinden von Signal und Slots muss man das Argument welches unter Umständen übergeben wird berücksichtigen.
    Bei unseren kleinen Beispiel hier oben waren keinen Argument vorhanden, da das Signal "clicked()" keine Argument übergibt und auch
    "quit()" kein Argument erwartet.

    Bei diesen Beispiel wird ein String dem Slot geschickt,

    Quellcode

    1. QObject::connect(eingabe, SIGNAL(textChanged(const QString&)), anzeige, SLOT(setText(const QString&)));


    Man kann wie schon erwähnt immer nur passende Signal and Slots verbinden.

    Natürlich kann man auch ohne weiteres eigene Signale und Slots erstellen, dabei sind aber ein paar Besonderheiten zu beachten.
    Ganz wichtig ist das Makro Q_OBJECT, wenn das vergessen wird gibt es zwar keinen Probleme beim kompilieren, aber es passiert ganz einfach nach her nichts.
    Slots werden als Funktion implementiert und Signale werden mittels den Befehl "emit" gesendet.

    Hier ist ein simples Beispiel für das erstellen von Signal und Slots.

    signalandslots.cpp:

    Quellcode

    1. # include "gui.h"
    2. int main(int argc, char *argv[])
    3. {
    4. // Hier wird das QT_Programm erschaffen
    5. QApplication app(argc, argv);
    6. Gui window;
    7. window.show();
    8. return app.exec();
    9. }
    Alles anzeigen


    gui.h:

    Quellcode

    1. # ifndef GUI_H
    2. # define GUI_H
    3. #include <QApplication>
    4. #include <QFont>
    5. #include <QPushButton>
    6. #include <QWidget>
    7. #include <QLabel>
    8. #include <iostream>
    9. using namespace std;
    10. class Gui : public QWidget
    11. {
    12. Q_OBJECT // Wichitg fuer das erstellen eigener Signal and Slots
    13. public:
    14. Gui(QWidget *parent = 0);
    15. private:
    16. QPushButton *beenden,
    17. *hallo;
    18. // Signale und Slots definieren
    19. signals:
    20. void fertig(void);
    21. private slots:
    22. void slotHallo(void);
    23. };
    24. # endif
    Alles anzeigen


    gui.cpp:

    Quellcode

    1. # ifndef GUI_CPP
    2. # define GUI_CPP
    3. # include "gui.h"
    4. Gui::Gui(QWidget *parent)
    5. : QWidget(parent)
    6. {
    7. // Die Einzelenen Objekte erzeugen
    8. QPushButton *beenden = new QPushButton("Beenden", this);
    9. QPushButton *hallo = new QPushButton("Hallo + Beneden", this);
    10. //setGeometry(PosH, PosV, Breite, Hoehe)
    11. hallo ->setGeometry(50, 60, 200, 30);
    12. beenden->setGeometry(50, 20, 200, 30);
    13. // Schriftgroesse und schriftart aendern
    14. beenden->setFont(QFont("Times", 12, QFont::Bold));
    15. hallo ->setFont(QFont("Times", 12, QFont::Bold));
    16. // Signale mit Slots verbinden
    17. connect(beenden, SIGNAL(clicked()), qApp, SLOT(quit()));
    18. connect(hallo, SIGNAL(clicked()), this, SLOT(slotHallo()));
    19. connect(this, SIGNAL(fertig()), qApp, SLOT(quit()));
    20. // Den Fenstertitel abspeichern
    21. setWindowTitle("Signal und Slots");
    22. // Minimum Breite und Höhe fuer das Fenster
    23. setMinimumSize(300,100);
    24. }
    25. void Gui::slotHallo(void)
    26. {
    27. // Hallo auf der Kommandozeile ausgeben
    28. cout<<endl<<" ! ! ! H A L L O ! ! !"<<endl;
    29. // 3 Sekunden warten
    30. sleep(3);
    31. cout<<endl<<" Jetzt wird das Signal ferig() gesendet"<<endl;
    32. // Das Signal fertig senden
    33. emit fertig();
    34. }
    35. # endif
    Alles anzeigen

    14.053 mal gelesen