Читаем QT 4: программирование GUI на С++ полностью

В приведенном выше примере мы разбиваем строку «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.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже