====== Timer ====== Mit der Klasse ''QTimer'' ist es möglich einen Slot nach einer bestimmten Zeit aufzurufen. Mehrmaliges Aufrufen durch Angabe des Zeitintervalls ist ebenfalls möglich. ===== statischer Timer ===== Die statische Methode ''QTimer::singleShot'' ist eine recht bequeme Möglichkeit einen Slot nach Ablauf der Zeit ein einziges Mal aufzurufen. void QTimer::singleShot (int msec, QObject *receiver, const char *member) **msec**: Zeit in Millisekunden nach der der Slot ausgeführt werden soll \\ **receiver**: Objekt, dessen Slot aufgerufen werden soll\\ **member**: Slot der aufgerufen werden soll (Makro SLOT () wird verwendet) \\ \\ Im folgenden Beispiel erstellen wir ein Label und beenden das Programm nach 5 Sekunden: #include #include #include int main (int argc, char *argv[]) { QApplication app (argc, argv); QLabel l ("Das Programm wird gleich beendet..."); l.show (); QTimer::singleShot (5000, &app, SLOT (quit ())); return app.exec (); } Wie wir sehen führt unsere Anwendung nach 5 Sekunden den Slot ''quit'' aus, wodurch sie beendet wird. ===== Timer-Objekte ===== Objekte der Klasse ''QTimer'' sind zwar nicht so schnell eingerichtet wie die statische Methode, allerdings bieten sie auch mehr Möglichkeiten. Alles was die statische Methode kann ist auch mit Objekten möglich. Durch die Methode ''setSingleShot'' können wir festlegen, dass der Slot nur ein einziges Mal aufgerufen werden soll. Der Hauptzweck des Objekts ist es aber einen Slot in einem bestimmten Intervall aufzurufen. Das Intervall kann sowohl über die Methode ''serInterval'' als auch direkt durch void QTimer::start (int msec) festgelegt werden. Nach Ablauf der Zeit wird das Signal ''timeout'' ausgelöst. Die parameterlose Methode ''stop'' hält den Timer an. \\ Nun wollen wir ein Label entwerfen, dass durch einen internen Timer ständig die Farbe wechselt. Dafür können wir HTML-Syntax verwenden, der von ''QLabel'' automatisch erkannt wird. Die Farben werden nach einem zufällig gewähltem Muster berechnet. // main.cpp #include "ColorLabel.h" #include int main (int argc, char *argv[]) { QApplication app (argc, argv); // Text des Labels setzen. Das 'ä' muss explizit als Unicode-Zeichen eingefügt werden ColorLabel label (QString ("Dieser Text %1ndert st%1nding seine Farbe!").arg (QChar (0x00E4))); label.show (); return app.exec (); } // ColorLabel.h #ifndef COLORLABEL_H #define COLORLABEL_H #include #include #include class ColorLabel : public QLabel // von normalem Label ableiten { Q_OBJECT public: ColorLabel (QString); // Text des Labels wird übergeben private: QTimer t; // Timer zum Ändern der Farbe unsigned char r, g, b; // Farbwerte für Farbcode im RGB-Format QString rstr, bstr, gstr, labeltext; // Farbwerte als String und eine Kopie des Textes des Labels private slots: void changeColor (); // Slot zum Ändern der Farbe }; #endif // ColorLabel.cpp #include "ColorLabel.h" // Dem Basisklassenkonstruktor wird der Text als Überschrift übergeben ColorLabel::ColorLabel (QString text) : QLabel (QString ("

" + text + "")) { labeltext = text; // Kopie des Textes speichern r = 255; // Farbwerte initialisieren g = 0; b = 0; // läuft die Zeit des Timers ab wird die Farbe geändert connect (&t, SIGNAL (timeout ()), this, SLOT (changeColor ())); t.start (10); // Timer mit einem Intervall von 10 Millisekunden starten } void ColorLabel::changeColor () { // die Farbwerte werden nach einem Muster verändert if (r == 255 && g == 0 && b != 255) b += 5; else if (r != 0 && g == 0 && b == 255) r -= 5; else if (r == 0 && g != 255 && b == 255) g += 5; else if (g == 255 && b != 0) b -= 5; else if (r != 255) r += 5; else g -= 5; rstr = QString::number (r, 16); // Hexadezimalwert (Basis = 16) des Rot-Anteils als String speichern if (rstr.size () < 2) // String muss 2 Stellen haben, falls nicht wird eine '0' vorangestellt rstr.prepend ('0'); gstr = QString::number (g, 16); // Hexadezimalwert (Basis = 16) des Grün-Anteils als String speichern if (gstr.size () < 2) gstr.prepend ('0'); bstr = QString::number (b, 16); // Hexadezimalwert (Basis = 16) des Blau-Anteils als String speichern if (bstr.size () < 2) bstr.prepend ('0'); // Text neu setzen; die Farbe wird im HTML-Syntax angegeben setText (QString ("

" + labeltext + "").arg (rstr + gstr + bstr)); }