Этот контейнер очень похож на QVector, но разница заключается в том, что это не шаблонный класс,
и в нем допускается хранение только элементов, имеющих размер один байт.
Объекты типа QByteArray можно использовать везде, где требуется промежуточное хранение данных.
Количество элементов массива можно задать в конструкторе, а доступ к ним получать при помощи оператора [].
QByteArray может быть использован для хранения строк.
Использование QByteArray более удобно, чем использование const char*.
Здесь всегда гарантировано, что данные завершаются '\0'.
Один из способов инициализации QByteArray - просто передать const char* в конструктор.
Код на слайде создает массив из 5 байт, содержащий данные "Hello".
QByteArray обладает всеми методами, присущими контейнеру, описанными ранее.
Помимо этого QByteArray обладает методами, возвращающими массив в преобразованном виде.
Поддерживаются преобразования в double, float, int, long, short в их беззнаковые аналоги, а также в шестнадцатеричное представление.
## Преобразование данных
Можно использовать метод toUtf8() для получения QByteArray, представляющего строку в кодировке UTF-8.
QDataStream позволяет сериализовать несколько типов данных, включая примитивные типы, в массив байтов для хранения или передачи по сети.
fromRawData(const char *data, int size)
Создаёт QByteArray, использующий первые size байтов массива данных.
Байты не копируются.
QByteArray будет содержать указатель на данные.
Вызывающий гарантирует, что данные не будут удалены или изменены, пока существует этот QByteArray и любые его копии, которые не были изменены.
QByteArray не становится владельцем данных, поэтому деструктор QByteArray никогда не удалит необработанные данные, даже если последний QByteArray, ссылающийся на эти данные, будет уничтожен.
Класс QRegExp обеспечивает сопоставление с шаблоном с использованием регулярных выражений.
Регулярное выражение, или «regexp», — это шаблон для сопоставления подстрок в тексте. Это полезно во многих контекстах, например,
* Проверка. Регулярное выражение может проверить, соответствует ли подстрока определённым критериям, например, является ли она целым числом или не содержит пробелов.
* Поиск. Регулярное выражение обеспечивает более эффективное сопоставление с шаблоном, чем простое сопоставление подстрок, например, сопоставляет одно из слов «mail», «letter» или «corresponsion», но не сопоставляет ни одно из слов «email», «mailman», «mailer», «letterbox» и т. д.
* Поиск и замена. Регулярное выражение может заменить все вхождения подстроки другой подстрокой, например, заменить все вхождения & на &, за исключением случаев, когда за & уже следует amp;.
* Разбиение строк. Регулярное выражение можно использовать для определения места, где следует разбить строку, например, для разбиения строк, разделённых табуляцией.
QRegExp создан по образцу языка регулярных выражений Perl.
Он полностью поддерживает Unicode.
QRegExp также может использоваться в более простом режиме с подстановочными знаками, аналогичном функциональности командных оболочек.
Правила синтаксиса, используемые QRegExp, можно изменить с помощью setPatternSyntax().
В частности, синтаксис шаблона можно установить как QRegExp::FixedString, что означает, что шаблон для сопоставления интерпретируется как обычная строка, т.е. специальные символы (например, обратная косая черта) не экранируются.
## Пример QRegExp
Поиск можно осуществлять в прямом направлении с помощью функции indexIn() или в обратном направлении с помощью функции lastIndexIn().
Доступ к захваченному тексту можно получить с помощью функции captureTexts(), которая возвращает список всех захваченных строк, или с помощью функции cap(), которая возвращает захваченную строку для указанного индекса.
## QRegularExpression — регулярные выражения
В Qt 5 новый класс QRegularExpression обеспечивает совместимую с Perl реализацию регулярных выражений и рекомендуется вместо QRegExp.
Главное отличие заключается в том, что QRegularExpression просто хранит регулярное выражение и не изменяется при запросе на сопоставление.
Вместо этого возвращается объект QRegularExpressionMatch для проверки результата сопоставления и извлечения захваченной подстроки.
QRegularExpression полностью поддерживает Unicode.
Строку шаблона можно задать, передав строку в конструктор QRegularExpression.
Также можно использовать функцию setPattern() для установки шаблона для существующего объекта QRegularExpression.
В соответствии с правилами C++ для литеральных строк все обратные косые черты внутри строки шаблона должны экранироваться ещё одной обратной косой чертой.
Последние два аргумента функций match() и globalMatch() задают тип и параметры сопоставления.
Тип сопоставления — это значение перечисления QRegularExpression::MatchType; «традиционный» алгоритм сопоставления выбирается с использованием типа сопоставления NormalMatch (по умолчанию).
Также можно включить частичное сопоставление регулярного выражения со строкой-объектом.
Параметры сопоставления — это набор из одного или нескольких значений QRegularExpression::MatchOption.
Они изменяют способ сопоставления конкретного регулярного выражения со строкой-объектом.
## Примеры QRegularExpression
Для выполнения сопоставления достаточно вызвать функцию match(), передав ей строку для сопоставления.
Результатом функции match() является объект QRegularExpressionMatch, который можно использовать для проверки результатов сопоставления.
Если сопоставление успешно, для извлечения подстроки, соответствующей всему шаблону, можно использовать (неявный) номер группы захвата 0.
Объект QRegularExpressionMatch также содержит информацию о подстроках, захваченных группами в строке шаблона. Функция capture() вернет строку, захваченную n-й группой.
Захваченные группы в шаблоне нумеруются, начиная с 1, а неявная группа 0 используется для захвата подстроки, соответствующей всему шаблону.
Класс QChar представляет 16-битный символ Unicode.
В Qt символы Unicode представляют собой 16-битные сущности без какой-либо разметки или структуры.
Класс QChar представляет такую сущность.
QChar легковесен, поэтому может использоваться повсеместно.
Большинство компиляторов обрабатывают его как unsigned short.
QChar предоставляет полный набор функций тестирования/классификации, преобразования в другие форматы и обратно, преобразования из составного Unicode в разложенный, а также сравнения и преобразования регистра.
Функции классификации: isNull() (возвращает true, если символ — '\0'), isPrint() (true, если символ является любым печатным символом, включая пробел), isPunct() (любой знак пунктуации), isMark() (знак Unicode), isLetter() (буква), isNumber() (любой числовой символ, кроме цифр от 0 до 9), isLetterOrNumber() и isDigit() (десятичные цифры).
Все они являются обёртками для функции category(), которая возвращает определённую в Unicode категорию каждого символа.
toLower() / toUpper() — функции для преобразования регистра символов в нижний и верхний соответственно.
Для QChar перегружены операторы ==, !=, <,<=,>, >=, <<,>>.
## QString — строка символов Unicode
Класс QString представляет собой строку символов Unicode.
QString обладает многими методами контейнеров, например, append(), remove(), count(), insert().
Но также QString обладает и собственными методами, например, arg(), split(), trimmed(),
startsWith(), endsWith(), toLower(), toUpper().
Метод arg() принимает на вход другую строку, которая будет подставляться вместо параметра внутри строки.
Пример с этим методом на следующем слайде.
Метод split() разбивает строку на подстроки и возвращает список подстрок.
Принимает на вход строку или регулярное выражение, которое будет являться разделителем, делящим строку на подстроки.
Метод trimmed() удаляет пробельные символы из строки и возвращает измененную строку.
Метод startsWith() возвращает true, если строка начинается со строки-аргумента метода.
Метод endsWith() возвращает true, если строка заканчивается строкой-аргументом метода.
Метод toLower() возвращает копию строки в нижнем регистре.
Метод toUpper() возвращает копию строки в верхнем регистре.
## QString: пример
Пример на экране демонстрирует использование описанных ранее методов QString.
Стоит обратить внимание на строку status, которая создается с помощью конструктора QString().
В конструктор передается строка с параметрами внутри в виде %1 и %2.
Чтобы подставить вместо параметров реальные значения используются методы arg(), которые вызываются
Далее пример применения метода split(), куда в качестве разделителя передается строка с пробельным символом.
Методы trimmed(), toLower(), toUpper(), startsWith() и endsWith() используются понятным образом.
## QStringRef — оболочка для подстрок QString
Класс QStringRef представляет тонкую оболочку для подстрок QString.
QStringRef предоставляет подмножество API QString, доступное только для чтения.
QStringRef предназначен для повышения производительности обработки подстрок при работе с подстроками, полученными из существующих экземпляров QString.
QStringRef позволяет избежать накладных расходов на выделение памяти и подсчёт ссылок, характерных для стандартного QString.
Это может оказаться полезным в низкоуровневом коде, например, используемом в парсере.
Для большинства пользователей использование QStringRef вместо QString не имеет семантических преимуществ, поскольку QStringRef требует внимания к вопросам управления памятью, что потенциально усложняет написание и поддержку кода.
QStringRef действителен только до тех пор, пока существует указанная строка. Если исходная строка удалена, ссылка на строку указывает на недопустимую область памяти.
Ссылка на строку явно ссылается на часть строки string() с заданным размером size(), начиная с указанной позиции position(). Вызов toString() возвращает копию данных в виде реального экземпляра QString.
Qt предлагает несколько способов выполнения поиска строк с использованием QString и связанных с ним классов.
QString::contains() проверяет, содержит ли строка определённый символ или подстроку.
QString::indexOf() возвращает индекс первого вхождения символа или подстроки.
Возвращает -1, если символ или подстрока не найдены.
QString::count() возвращает количество вхождений определённого символа или подстроки в строке.
QRegularExpression обеспечивает сопоставление с шаблоном, поиск и замену на основе регулярных выражений. Идеально подходит для сложных шаблонов или когда требуется большая гибкость, чем простое сопоставление подстрок.
QStringList::filter() извлекает новый список, содержащий только строки, содержащие определённую подстроку или соответствующие регулярному выражению.
## Проверка структуры строки
Для сложного сопоставления с шаблоном QRegularExpression — самый мощный инструмент.
Он позволяет определить шаблон строки с помощью синтаксиса регулярных выражений, а затем проверить, соответствует ли ему QString.
Для более простых проверок QString предлагает такие методы, как contains(), startingWith(), endsWith() и indexOf().
Чтобы проверить, представляет ли QString число (целое, число с плавающей точкой и т. д.), можно попробовать выполнить преобразование.
Для специфичных проверок на уровне символов можно перебрать QString и проверить отдельные элементы QChar.
## Редактирование строк
В Qt строки в основном обрабатываются классом QString.
Этот класс предоставляет большой набор функций для редактирования и обработки строковых данных.
Например, метод QString::replace() при использовании с объектом QRegularExpression позволяет заменить все вхождения шаблона на указанную строку.
QByteArray и QString позволяют работать со строкой как со списком символов и реализовывать соответствующие алгоритмы.