Qt - klasa QString i operacje tekstowe

Stronę tą wyświetlono już: 45 razy

Biblioteka Qt udostępnia własną klasę QString, która (jak zresztą można się domyślić) umożliwia tworzenie przechowywanie ciągów znaków, przeprowadzanie na nich szeregu operacji, konwersji liczba → tekst i tekst → liczba. Warto więc zapoznać się z częścią metod i operatorów, jakich owa klasa udostępnia. Żeby możliwe było skorzystanie z klasy QString konieczne jest załączenie pliku QString.

Długość ciągu znaków

Za pomocą metody length można pozyskać informację o liczbie przechowywanego ciągu znaków. Ta metoda jest równoważna metodzie size

Sprawdzanie, czy obiekt klasy QString został zainicjalizowany lub czy jest pusty

Metoda isEmpty zwraca true, gdy ciąg znaków przechowywanych przez zmienną ma długość równą 0. Natomiast metoda isNull zwraca true, gdy obiekt został zainicjalizowany domyślnym konstruktorem.

Czyszczenie zawartości klasy QString

Metoda clear usuwa przechowywany w obiekcie ciąg znaków.

Konwersja test → liczba

Klasa QString udostępnia następujące metody, które konwertują zapisaną w obiekcie klasy dane liczbowe w postaci tekstowej na liczbę danego typu. Oto lista podstawowych metod tego typu:

  • zamiana tekstu na liczbę całkowitą:
    • toShort;
    • toUShort;
    • toInt;
    • toUInt;
    • toLong;
    • toULong;
    • toLongLong;
    • toULongLong;
  • zamiana tekstu na liczbę zmiennoprzecinkową:
    • toFloat;
    • toDouble

Metody zamieniające tekst na liczbę całkowitą mogą przyjmować dwa opcjonalne argumenty, oto przykład wykorzystania metody toInt w różnych wersjach:

Listing 1
  1. qDebug() << "Podaj jakąś liczbę: ";
  2. int value1 = 0;
  3. QTextStream stream(stdin);
  4. value1 = stream.readLine().toInt();
  5. qDebug() << value1;
  6. qDebug() << "Podaj jakąś liczbę: ";
  7. bool w = false;
  8. int value2 = 0;
  9. do{
  10. value2 = stream.readLine().toInt(&w);
  11. if(!w){
  12. qDebug() << "Liczbę, miała być liczba!";
  13. }
  14. }while(!w);
  15. qDebug() << value2;
  16. qDebug() << "Podaj jakąś liczbę w systemie szesnastkowym: ";
  17. int value3 = 0;
  18. do{
  19. value3 = stream.readLine().toInt(&w, 16);
  20. if(!w){
  21. qDebug() << "Liczbę, miała być liczba!";
  22. }
  23. }while(!w);
  24. qDebug() << value3;

Istnieje również metoda number, która jest wielokrotnie przeciążona i może przyjmować różne typy danych liczbowych.

Konwersja liczba → tekst

Możliwa jest również oczywiście konwersja liczby na ciąg znaków. W tym celu klasa QString udostępnia metodę arg, która jest wielokrotnie przeciążona. Oto przykład wykorzystania tejże funkcji:

Listing 2
  1. auto string = QString("Dziesiętnie %1 to %2 szesnastkowo").arg(63).arg(63, 0, 16);
  2. qDebug() << string;

W przypadku liczb całkowitych metoda arg jako pierwszy argument przyjmuje zamienianą wartość liczbową, natomiast drugi argument to minimalna liczba znaków, jaką liczba musi zajmować, trzeci argument to system zapisu liczby. Powyższy przykład wyświetli:

Dziesiętnie 63 to 3f szesnastkowo

Łączenie, zastępowanie i usuwanie ciągów znaków

  • append - dodaje podany jako argument tekst na koniec obiektu;
  • prepend - dodaje podany jako argument tekst na początek obiektu;
  • insert - dodaje podany jako argument tekst w podanym miejscu;
  • replace - zastępuje podany zakres znaków nowym ciągiem znaków;
  • remove - usuwa z tekstu podany zakres znaków;
  • trimmed - usuwa z początku i końca tekstu wszystkie białe znaki;
  • simplified - usuwa z początku i końca tekstu wszystkie białe znaki oraz zastępuje wystąpienia białych znaków pomiędzy wyrazami pojedynczą spacją;
Listing 3
  1. QString string = "middle";
  2. qDebug() << string;
  3. string.prepend("first "); // "first middle"
  4. qDebug() << string;
  5. string.append(" last"); // "first middle last"
  6. qDebug() << string;
  7. string.replace(6, 6, "&"); // "first & last"
  8. qDebug() << string;

Wynik działania powyższego kodu:

"middle"
"first middle"
"first middle last"
"first & last"

Łączenie ciągów znaków możliwe jest również przy wykorzystaniu operatora + lub +=:

Listing 4
  1. QString string("Some string");
  2. string += " to" + QString(" add");
  3. qDebug() << string;

Zamiana małych liter na duże i dużych na małe

  • toUpper - zamienia litery na duże;
  • toLower - zamienia litery na małe;
Listing 5
  1. QString string("MałgOsIa MaŁa OwIeCzKę MiAła");
  2. qDebug() << string.toLower();
  3. qDebug() << string.toUpper();

Powyższy kod wyświetlić powinien:

"małgosia mała owieczkę miała"
"MAŁGOSIA MAŁA OWIECZKĘ MIAŁA"

Metody wycinające fragment tekstu

  • left - wycina podaną jako argument tej metody liczbę znaków licząc od początku tekstu;
  • mid - wycina określoną liczbę znaków licząc od podanej pozycji;
  • right - wycina podaną jako argument tej metody liczbę znaków licząc od końca tekstu;
Listing 6
  1. QString string("left mid right");
  2. qDebug() << string.left(4);
  3. qDebug() << string.mid(5, 3);
  4. qDebug() << string.right(5);

Powyższy kod wyświetlić powinien:

"left"
"mid"
"right"

Dzielenie (parsowanie) tekstu

Metoda Split umożliwia podzielenie tekstu względem podanego znaku. Oto przykład jej wykorzystania:

Listing 7
  1. QString string("Some text to split"); // wstawiłem tutaj dwie spacje
  2. QStringList list1 = string.split(' '); // dzielenie względem spacji spowoduje zwrócenie listy ["Some", "text", "", "to", "split"]
  3. QStringList list2 = string.split(' ', QString::SkipEmptyParts); // dzielenie względem spacji spowoduje zwrócenie listy z pominięciem pustych ciągów znaków ["Some", "text", "to", "split"]

Znajdowanie ciągu tekstu w tekście

Istnieją dwie metody służące do odnajdywania tekstu w tekście:

  • indexOf - zwraca pozycję pierwszego wystąpienia podanego ciągu znaków;
  • lastIndexOf - zwraca pozycję ostatniego wystąpienia podanego ciągu znaków;
Listing 8
  1. QString string("abcdefgh");
  2. qDebug() << string.indexOf("a");
  3. qDebug() << string.indexOf("a", 1);
  4. qDebug() << string.indexOf("d");

Rezultat działania powyższego kodu:

0
-1
3

Możliwe jest również wykorzystanie wyrażeń regularnych:

Listing 9
  1. QString string("Post code 00-111 next post code 00-234");
  2. int index = string.indexOf(QRegExp("\\d{2,2}\\-\\d{3,3}"));
  3. while(index != -1){
  4. qDebug() << string.mid(index, 6);
  5. index += 6;
  6. index = string.indexOf(QRegExp("\\d{2,2}\\-\\d{3,3}"), index);
  7. }

Wynik działania powyższego kodu:

"00-111"
"00-234"

Porównywanie dwóch ciągów znaków

Klasa QString obsługuje operatory porównania oraz dysponuje metodą compare umożliwiającą porównywanie dwóch ciągów znaków. Oto przykład z wykorzystaniem metody compare:

Listing 10
  1. QString string("abcdefgh");
  2. QString string2("ABCDEFGH");
  3. if(string.compare(string2)){
  4. qDebug() << string << "!=" << string2;
  5. }else{
  6. qDebug() << string << "==" << string2;
  7. }
  8. if(string.compare("abcdefgh")){
  9. qDebug() << string << "!=" << "abcdefgh";
  10. }else{
  11. qDebug() << string << "==" << "abcdefgh";
  12. }

Wynik działania powyższego kodu:

"abcdefgh" != "ABCDEFGH"
"abcdefgh" == abcdefgh

Możliwe jest również wykorzystanie operatorów:

  • < - mniejsze niż;
  • <= - mniejsze lub równe;
  • == - równe;
  • != - nie równe;
  • >= - większe lub równe;
  • > - większe

Oczywiście różnica pomiędzy użyciem powyższych operatorów a użyciem metody compare jest taka, że operator zwraca wartość typu bool natomiast metoda compare zwraca liczbę typu int określającą różnicę pomiędzy dwoma ciągami znaków.

Komentarze