From Mirek Socha zapraszam!

Qt: Q String

1. Opis

Bardzo użyteczna klasa, umożliwiająca wydajne i proste przetwarzanie "ciągów znaków" czyli tekstu :)

Klasa QString przechowuje napisy w 16-bitowych "znakach" QChar zgodnie ze standardem Unicode 4.0

Szczegółowy opis znajduje się na stronie dokumentacji Qt. Poniższe przykłady opracowano na podstawie dokumentacji Qt.

2. Podstawowe możliwości


     QString x = "free";
     QString y = "dom";
     x += y;                   // x == "freedom"

     QString str = "and";
     str.prepend("rock ");     // str == "rock and"
     str.append(" roll");      // str == "rock and roll"
     str.replace(5, 3, "&");   // str == "rock & roll"

     QString str = "Meal";
     str.insert(1, QString("ontr"));  // str == "Montreal"
     str.remove(1, 4);                // str == "Meal"

     QString t = "Ali Baba";
     t.remove(QChar('a'), Qt::CaseInsensitive); // t == "li Bb"

     QString str("ab");
     str.repeated(4);           // str == "abababab"
 

2.1. Konwersja na tablicę znaków char

Często potrzebna jest zamiana obiektu QString na tablicę znaków char *. Robi się to zamieniając QStringa na QByteArray a następnie używając metodą data() "wystawia się" tablicę znaków.

Jeżeli wymagana jest jednorazowa zamiana, np. jednokrotne podanie tablicy znaków do funkcji, możliwe jest wywołanie kaskadowe:


    QString str("./pic.jpg");

    // obiekt.setFileName(char *) - jakaś metoda, potrzebująca tablicy znaków

    obiekt.setFileName( str.toAscii().data() ); // użycie QString "jednorazowe"
 

Powyższa metoda może być niebezpieczna, ponieważ wynik działania metody toAscii() jest tymczasowy! Lepszym rozwiązaniem, szczególnie gdy dane z obiektu Q String będą wielokrotnie wykorzystywane, jest jawne użycie obiektu QByteArray:


    QString     str("tekst");              // tekst do analizy, w dowolnym kodowaniu
    QByteArray  data = string.toAscii();   // zamiana tekstu na "czysty" ciąg znaków

    // stworzenie wskaźnika, który może być bezpiecznie wielokrotnie wykorzystywany:
    const char * ptr = bytes.data();      
 

Innym podejściem jest konwersja do std::string a następnie do char *:


    QString str("tekst.txt");

    const char* t = str.toStdString().c_str();
 

Jeszcze inna metoda to użycie funkcji qPrintable:


const char* qPrintable (const QString & str)
 

2.2. Użycie argumentów

Klasa Q String umożliwia automatyczną obsługę do 99 argumentów (%1, %2, ..., %99), wraz z rozpoznawaniem typu i formatowaniem. Szczegółowa dokumentacja.


     int     i;           // numer
     longint total;       // liczba wszystkich
     QString fileName;    // nazwa pliku

     QString status = QString("Przetworzono %1 z %2: %3")
                     .arg(i).arg(total).arg(fileName);  

     double d = 12.34;
     QString str = QString("delta: %1").arg(d, 0, 'E', 3);
     // str == "delta: 1.234E+01
 

2.3. Dostęp do znaków

Dostęp do konkretnych znaków w tekście można zrealizować 'operatorem tablicowym' [ ] lub też szybszą metodą at(). Operator [] umożliwia odczyt i zapis znaku, zaś metoda at() jedynie odczyt.


     QString str = "??text??";

     if (str[0] == QChar('?'))
         str[0] = QChar('_');

     for (int i = 0; i < str.size(); ++i) {
         if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))
             qDebug() << "Znaleziono znak z zakresu [a-f]";
     }
 

2.4. Porównywanie tekstu


     QString().isNull();               // returns true
     QString().isEmpty();              // returns true

     QString("").isNull();             // returns false
     QString("").isEmpty();            // returns true

     QString("abc").isNull();          // returns false
     QString("abc").isEmpty();         // returns false

     int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive);  // x == 0
     int y = QString::compare("auto", "Car", Qt::CaseSensitive);     // y > 0
     int z = QString::compare("auto", "Car", Qt::CaseInsensitive);   // z < 0

     QString str = "Peter Pan";
     str.contains("peter", Qt::CaseInsensitive);    // returns true

     QString x = "sticky question";
     QString y = "sti";
     x.indexOf(y);               // returns 0
     x.indexOf(y, 1);            // returns 10
     x.indexOf(y, 10);           // returns 10
     x.indexOf(y, 11);           // returns -1

     QString str = "the minimum";
     str.indexOf(QRegExp("m[aeiou]"), 0);       // returns 4

     QString x = "crazy azimuths";
     QString y = "az";
     x.lastIndexOf(y);           // returns 6
     x.lastIndexOf(y, 6);        // returns 6
     x.lastIndexOf(y, 5);        // returns 2
     x.lastIndexOf(y, 1);        // returns -1
 

2.5. Dzielenie i łączenie tekstu

Metoda section umożliwia analizę ciągów tekstu rozdzielonych określonymi znakami, np. ścieżki dostępu. Indeksowanie liczbami dodatnimi umożliwia poruszanie się od początku (od lewej strony) tekstu, zaś ujemnymi - od końca (od prawej strony). Do określania separatorów możliwe jest również wykorzystanie "wyrażeń regularnych" QRegExp .


     QString str;
     QString csv = "forename,middlename,surname,phone";
     QString path = "/usr/local/bin/myapp"; // First field is empty
     QString::SectionFlag flag = QString::SectionSkipEmpty;

     str = csv.section(',', 2, 2);   // str == "surname"
     str = path.section('/', 3, 4);  // str == "bin/myapp"
     str = path.section('/', 3, 3, flag); // str == "myapp"
     str = csv.section(',', -3, -2);  // str == "middlename,surname"
     str = path.section('/', -1); // str == "myapp"

     QString line = "forename\tmiddlename  surname \t \t phone";
     QRegExp sep("\\s+");
     str = line.section(sep, 2, 2); // s == "surname"
     str = line.section(sep, -3, -2); // s == "middlename  surname"
 

Metoda split umożliwia dzielenie tekstu na "listę wyrazów".


     QString str = "a,,b,c";

     QStringList list1 = str.split(",");
     // list1: [ "a", "", "b", "c" ]

     QStringList list2 = str.split(",", QString::SkipEmptyParts);
     // list2: [ "a", "b", "c" ]

     QString str = list2.join( ": " );    // łączenie listy 'wyrazów'
     // str == "a: b: c: "
 

Użycie wyrażeń regularnych QRegExp:


     QString str;
     QStringList list;

     str = "Some  text\n\twith  strange whitespace.";
     list = str.split(QRegExp("\\s+"));
     // list: [ "Some", "text", "with", "strange", "whitespace." ]

     str = "This time, a normal English sentence.";
     list = str.split(QRegExp("\\W+"), QString::SkipEmptyParts);
     // list: [ "This", "time", "a", "normal", "English", "sentence" ]

     str = "Now: this sentence fragment.";
     list = str.split(QRegExp("\\b"));         // znacznik [@\b@] oznacza 'granice wyrazów'
     // list: [ "", "Now", ": ", "this", " ", "sentence", " ", "fragment", "." ]
 

2.6. Konwersje


     QString str = "1234.56";
     double val = str.toDouble();   // val == 1234.56

     bool ok;
     double d;

     d = QString( "1234.56e-02" ).toDouble(&ok); // ok == true, d == 12.3456

     QLocale::setDefault(QLocale::C);          // ustawienia lokalne
     d = QString( "1234,56" ).toDouble(&ok);     // ok == false
     d = QString( "1234.56" ).toDouble(&ok);     // ok == true, d == 1234.56

     QLocale::setDefault(QLocale::German);
     d = QString( "1234,56" ).toDouble(&ok);     // ok == true, d == 1234.56
     d = QString( "1234.56" ).toDouble(&ok);     // ok == true, d == 1234.56

     QString str = "FF";
     int hex = str.toInt(&ok, 16);       // hex == 255, ok == true
     int dec = str.toInt(&ok, 10);       // dec == 0, ok == false

 

2.7. Operacje na strumieniach


     QString result;
     QTextStream(&result) << "pi = " << 3.14;
     // result == "pi = 3.14"
 
Retrieved from http://home.agh.edu.pl/~socha/pmwiki/pmwiki.php/Qt/QString
Data ostatniej modyfikacji: 26.11.2013, 22:42