====== 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));
}