Inhaltsverzeichnis

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 <QApplication>
#include <QLabel>
#include <QTimer>
 
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 <QApplication>
 
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 <QLabel>
#include <QTimer>
#include <QString>
 
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 ("<h2>" + text + "</h>"))
{
 
  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 ("<font color=#%1><h2>" + labeltext + "</h></font>").arg (rstr + gstr + bstr));
 
}