Qt - klasa QString i operacje tekstowe

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 6408 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:

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

qDebug() << "Podaj jakąś liczbę: "; int value1 = 0; QTextStream stream(stdin); value1 = stream.readLine().toInt(); qDebug() << value1; qDebug() << "Podaj jakąś liczbę: "; bool w = false; int value2 = 0; do{ value2 = stream.readLine().toInt(&w); if(!w){ qDebug() << "Liczbę, miała być liczba!"; } }while(!w); qDebug() << value2; qDebug() << "Podaj jakąś liczbę w systemie szesnastkowym: "; int value3 = 0; do{ value3 = stream.readLine().toInt(&w, 16); if(!w){ qDebug() << "Liczbę, miała być liczba!"; } }while(!w); 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:

auto string = QString("Dziesiętnie %1 to %2 szesnastkowo").arg(63).arg(63, 0, 16); 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

QString string = "middle"; qDebug() << string; string.prepend("first "); // "first middle" qDebug() << string; string.append(" last"); // "first middle last" qDebug() << string; string.replace(6, 6, "&"); // "first & last" 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 +=:

QString string("Some string"); string += " to" + QString(" add"); qDebug() << string;

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

QString string("MałgOsIa MaŁa OwIeCzKę MiAła"); qDebug() << string.toLower(); 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

QString string("left mid right"); qDebug() << string.left(4); qDebug() << string.mid(5, 3); 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:

QString string("Some text to split"); // wstawiłem tutaj dwie spacje QStringList list1 = string.split(' '); // dzielenie względem spacji spowoduje zwrócenie listy ["Some", "text", "", "to", "split"] 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:

QString string("abcdefgh"); qDebug() << string.indexOf("a"); qDebug() << string.indexOf("a", 1); qDebug() << string.indexOf("d");

Rezultat działania powyższego kodu:

0
-1
3

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

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

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:

QString string("abcdefgh"); QString string2("ABCDEFGH"); if(string.compare(string2)){ qDebug() << string << "!=" << string2; }else{ qDebug() << string << "==" << string2; } if(string.compare("abcdefgh")){ qDebug() << string << "!=" << "abcdefgh"; }else{ qDebug() << string << "==" << "abcdefgh"; }

Wynik działania powyższego kodu:

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

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

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.

Propozycje książek