При обработке введенных пользователем данных нам часто необходимо, кроме удаления пробельных символов с обоих концов строки, заменить каждую последовательность таких символов одним пробелом. Именно это выполняет функция simplified():
QString str = " ВОВ \t THE \nDOG \n";
qDebug() << str.simplified();
Строка, возвращаемая функцией simplified(), имеет вид
ВОВ_THE_DOG
Строку можно разбить на подстроки типа QStringList при помощи функции QList::split():
QString str = "polluter pays principle";
QStringList words = str.split(" ");
В приведенном выше примере мы разбиваем строку «polluter pays principle» на три подстроки: «polluter», «pays» и «principle». Функция split() имеет необязательный третий аргумент, показывающий, надо ли оставлять пустые подстроки (режим по умолчанию) или нет.
Элементы списка QStringList могут объединяться в одну строку при помощи функции join(). Передаваемый функции join() аргумент вставляется между каждой парой объединяемых строк. Например, ниже показано, как создавать одну строку из всех строк списка QStringList, расположенных в алфавитном порядке и разделенных символом перехода на новую строку:
words.sort();
str = words.join("\n");
При обработке строк нам часто приходится определять, пустая строка или нет. Это делается при помощи вызова функции isEmpty() или проверкой равенства нулю возвращаемого функцией length() значения.
Преобразование строк const char * в QString в большинстве случаев выполняется автоматически, например:
str += " (1870)";
Здесь мы добавляем строку const char * в конец строки QString без выполнения явного преобразования. Для явного преобразования const char * в QString выполните приведение типа в QString или вызовите функцию fromAscii() или fromLatin1(). (Работа с литеральными строками в других кодировках рассматривается в главе 17.)
Для преобразования QString в const char * используйте функцию toAscii() или toLatin1(). Эти функции возвращают QByteArray, который может быть преобразован в const char *, используя QByteArray::data() или QByteArray::constData(). Например:
printf("User: %s\n", str.toAscii().data());
Для удобства в Qt предусмотрен макрос qPrintable(), который эквивалентен последовательности функций toAscii().constData():
printf("User: %s\n", qPrintable(str));
Когда мы вызываем функции data() или constData() для объектов типа QByteArray, владельцем возвращаемой строки будет этот объект. Это означает, что нам не надо беспокоиться о возможных утечках памяти — Qt вернет нам память. С другой стороны, мы должны проявлять осторожность и не использовать указатель слишком долго. Если объект QByteArray не хранится в переменной, он будет автоматически удален в конце выполнения оператора.
Программный интерфейс класса QByteArray очень похож на программный интерфейс класса QString. Такие функции, как left(), right(), mid(), toLower(), toUpper(), trimmed() и simplified(), существуют в QByteArray и имеют такую же семантику, как и соответствующие функции в QString. QByteArray полезно использовать для хранения неформатированных двоичных данных и строк с 8-битовой кодировкой текста. В целом мы рекомендуем использовать QString для хранения текста, а не QByteArray, потому что QString поддерживает кодировку Unicode.
Для удобства QByteArray всегда автоматически обеспечивает наличие символа '\0' после последнего байта, облегчая передачу объекта QByteArray функции, принимающей const char *. QByteArray также может содержать внутри себя символы '\0', что позволяет использовать этот тип для хранения произвольных двоичных данных.
В некоторых ситуациях требуется в одной переменной хранить данные различных типов. Один из таких методов заключается в представлении этих данных в виде QByteArray или QString. Например, в виде строки можно хранить как текстовое значение, так и числовое значение. Эти подходы обеспечивают максимальную гибкость, но лишают некоторых преимуществ С++, в частности связанных с безопасностью типов и высокой эффективностью. Qt обеспечивает значительно более удобный способ для хранения данных различного типа: QVariant.