Qt - klasa QString i operacje tekstowe
Stronę tą wyświetlono już: 5073 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:
- 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
- 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ą;
- 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
- toUpper - zamienia litery na duże;
- toLower - zamienia litery 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
- 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;
- 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:
- indexOf - zwraca pozycję pierwszego wystąpienia podanego ciągu znaków;
- lastIndexOf - zwraca pozycję ostatniego wystąpienia podanego ciągu znaków;
- 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:
- < - 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.

Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski

Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz

Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha

Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams

Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis

Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół

Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz

Tytuł:
OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
Autor:
Adrian Kaehler, Gary Bradski

Tytuł:
C++ w 24 godziny. Wydanie VI
Autor:
Rogers Cadenhead, Jesse Liberty

Tytuł:
C++ Optymalizacja kodu. Sprawdzone techniki zwiększania wydajności
Autor:
Guntheroth Kurt