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