В приведенном выше примере мы разбиваем строку «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.Класс QVariant
может содержать значения многих типов Qt, включая QBrush, QColor, QCursor, QDateTime, QFont, QKeySequence, QPalette, QPen, QPixmap, QPoint, QRect, QRegion, QSize и QString, а также такие основные числовые типы С++, как double и int. Класс QVariant может, кроме того, содержать контейнеры QMap, QStringList и QList.Широкое распространение получило применение этого типа в классах отображения элементов, в модуле баз данных и в классе QSettings,
позволяя считывать и записывать данные элементов, данные базы данных и пользовательские настройки в виде любого значения, допускаемого типом QVariant. Пример этого мы уже видели в главе 3, когда объекты QRect, QStringList и пара булевых значений передавались функции QSettings::setValue и затем считывались как объекты QVariant.