====== 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
#include
#include
// 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];
}
}