Dies ist eine alte Version des Dokuments!


QTime

Zur Darstellung und Verarbeitung von Uhrzeiten wird QTime verwendet. Die aktuelle Uhrzeit kann mit der statischen Methode QTime::currentTime() abgefragt werden. Über die ebenfalls statische Methode QTime::isValid() kann die Gültigkeit einer Uhrzeit geprüft werden:

QTime::isValid(12, 1, 2, 3);  // true
QTime::isValid(25, 4, 5, 6);  // false

Konvertierung zwischen QString und QTime

QTime-Objekte können sehr einfach in Text konvertiert umgewandelt werden - und umgekehrt. Dazu dient die Methode QTime::toString() bzw. die statische Methode QTime::fromString(). Letztere bietet uns verschiedene Optionen, deshalb sehen wir sie uns genauer an:

QTime QTime::fromString (const QString& string, const QString& format)

string: String, der die Uhrzeit enthält
format: Format der Uhrzeit im String
Für die Formatangabe werden folgende Buchstaben verwendet:

Format Bedeutung zutreffende Beispiele
h Stundenzahl ohne führende 0 3; 14
hh Stundenzahl mit führender 0 03; 14
m Minutenzahl ohne führende 0 5; 25
mm Minutenzahl mit führender 0 05; 25
s Sekundenzahl ohne führende 0 7; 36
ss Sekundenzahl mit führender 0 07; 36
z Millisekunden ohne führende 0 8; 123
zzz Millisekunden mit führender 0 008; 123
AP 12 Stunden-Format; AP muss entweder „AM“ oder „PM“ sein. AM; PM
ap 12 Stunden-Format; AP muss entweder „am“ oder „pm“ sein. am; pm

Dazu noch ein Code-Beispiel:

QTime t = QTime::currentTime();
QString text = "13:37:42";
 
std::cout << "Es ist " << t.toString().toStdString() << " Uhr." << std::endl;
t = QTime::fromString(text, "hh:mm:ss");
std::cout << t.toString().toStdString() << std::endl;

Ausgabe:

Es ist 15:02:22 Uhr.
13:37:42

Zeitmessung mit QTime

QTime kann auch zur Zeitmessung eingesetzt werden. Dafür werden die Methoden QTime::start(), QTime::restart() und QTime::elapsed() verwendet. QTime::start() startet den Timer mit der aktuellen Uhrzeit. QTime::restart() macht genau das selbe, aber gibt zusätzlich die seit dem letzten Start verstrichene Zeit in Millisekunden zurück. QTime::elapsed() gibt nur die Zeit zurück und lässt den Timer unverändert weiterlaufen.
Wir können diese Methoden für einen einfachen Benchmark verwenden (Selectionsort vs. Insertionsort; die Algorithmen spielen in diesem Zusammenhang aber keine Rolle):

#include <QTime>
#include <cstring>
#include <iostream>
 
// Anzahl der Elemente im Array
const int num = 10000;
 
// Prototypen für Algorithmen
void selectionSort (int *vec, int n);
void insertionSort (int *vec, int n);
 
int main()
{
 
  int array[num],     // Array mit Zufallszahlen; wird nicht verändert
      buffer,         // Puffer-Element für Insertionsort
      copy[num];      // Kopie des Arrays mit Zufallszahlen
  QTime t = QTime::currentTime();  // aktuelle Zeit abfragen
  qsrand(t.msec());   // Zufallsgenerator initialisieren
 
  // Array mit Zufallszahlen füllen
  for (int i = 0; i < num; i++)
    array[i] = qrand();
 
  memcpy(copy, array, num * sizeof(int));  // Zufallszahlen kopieren
  t.start();                               // Timer starten
  selectionSort(copy, num);                // Array mit Selectionsort sortieren
  std::cout << "Selectionsort: " << t.elapsed() << std::endl;  // vergangene Zeit ausgeben
 
  memcpy(copy, array, num * sizeof(int));  // Zufallszahlen kopieren
  t.start();                               // Timer starten
  insertionSort(copy - 1, num);            // Array mit Insertionsort sortieren
  std::cout << "Insertionsort: " << t.elapsed() << std::endl;  // vergangene Zeit ausgeben
 
  return 0;
 
}
 
 
void selectionSort (int *vec, int n)
{
 
  int i, j, help, min;
 
  for (i = 0; i < n - 1; i++)
  {
    min = i;
 
    for (j = i + 1; j < n; j++)
      if (vec[j] < vec[min])
        min = j;
 
    if (min != i)
    {
      help = vec[i];
      vec[i] = vec[min];
      vec[min] = help;
    }
  }
 
}
 
 
void insertionSort (int *vec, int n)
{
 
  int i, j;
 
  for (i = 2; i <= n; i++)
  {
    j = i;
    vec[0] = vec[i];
 
    while (vec[0] < vec[j - 1])
    {
      vec[j] = vec[j - 1];
      j--;
    }
 
    vec[j] = vec[0];
  }
 
}