Урок №2. Строки в Qt5

  Дмитрий Бушуев  | 

    | 

  Обновл. 9 Сен 2019  | 

 572

 ǀ   9 

В этом уроке мы будем работать со строками. Для этого в Qt5 реализован класс QString, который является очень мощным классом с большим количеством полезных методов.

Строки

Класс QString предоставляет Unicode-строку, которая сохраняет обычную строку в качестве 16-битных значений типа QChar, где каждый QChar соответствует одному символу формата Unicode 4.0. В отличие от строк во многих других языках программирования, QString можно изменять.

Примечание: Все примеры в этом уроке выполнены в формате консольного приложения. Поэтому, если вы откроете файл проекта, то сможете увидеть строчку QT -= gui, которая отключает модуль Qt GUI, отвечающий за графический интерфейс пользователя.

В нашем первом примере мы попробуем использовать несколько базовых методов класса QString. В этом нам поможет класс QTextStream, который предоставляет удобный интерфейс для чтения и записи текстовых данных:

Результат выполнения программы выше:

Обратите внимание, методы a.toUpper() и a.toLower() не модифицируют исходную строку, а работают с её копией.

А здесь мы создаём объект (вы можете назвать его и по-другому) out класса QTextStream, чтобы связать его со стандартным выводом (stdout) и иметь возможность использовать функционал класса QTextStream — выполнять вывод на экран:

Инициализация строк


Класс QString позволяет инициализировать строки разными способами. Ниже представлен пример с 5-тью различными вариантами инициализации:

Результат выполнения программы выше:

Инициализация №3: Инициализация строки с помощью средств стандартной библиотеки C++. Метод c_str() генерирует строку C-style. Данный массив символов, который является классическим способом представления строк в языке C, может быть присвоен объекту класса QString:

Инициализация №4: Мы конвертируем стандартную строку C++ в объект класса QString, используя метод fromLatin1(). Данный метод принимает указатель на массив символов, возвращаемый методом s2.data(). Второй параметр — это размер строки:

Инициализация №5: А это строка в языке C, которая является массивом символов. Один из конструкторов класса QString может принимать массив символов в качестве параметра:

Доступ к элементам строки

Объект класса QString представляет собой последовательность QChar-«символов» (я специально взял в кавычки слово «символы»). Доступ к элементам строки можно получить c помощью оператора [] или метода at(). В следующем примере мы будем выводить отдельные символы строки, которая является объектом класса QString:

Результат выполнения программы выше:


Примечание: Убедитесь, что при использовании метода at() ваш индекс не выходит за границы массива.

Длина строки


Есть 3 метода, которые позволяют получить информацию о длине строки: size(), count() и length(). Все они делают одно и то же — возвращают количество символов в строке. В примере ниже мы выводим длину 4-ёх строк:

Результат выполнения программы выше:

Построение строк

Динамическое построение строк позволяет нам заменять определённые управляющие символы нужными нам значениями. Для этого используется метод arg(). Место, в которое нужно вставить значение, помечается специальным маркером: символом %. Число, следующее за символом %, является номером аргумента. Аргументов может быть несколько. Метод arg() может принимать следующие типы данных: int, long, char, QChars и др.

Результат выполнения программы выше:

Подстроки


При работе со строками вам может понадобится выделить подстроку из исходной строки. Справиться с данной задачей помогут методы left(), right() и mid():

Результат выполнения программы выше:

Класс QStringRef является версией «только для чтения» класса QString. Первым параметром мы указываем исходную строку, вторым — начальную позицию, третьим — длину подстроку:

Циклы и строки

Объекты класса QString состоят из элементов типа QChar. При этом мы можем использовать циклы для доступа к каждому элементу строки. Мы рассмотрим 3 варианта работы с элементами объектов класса QString:

Результат выполнения программы выше:

Способ №1: Ключевое слово foreach является расширением языка C++ средствами Qt. Первый параметр — это элемент строки, а второй — строка, которую мы будем перебирать поэлементно:

Способ №2: Использование итераторов:

Способ №3: Используем цикл for, где с помощью метода size() получаем допустимые границы перебора, а с помощью метода at() — доступ к элементам строки:

Сравнение строк

Статический метод QString::compare() используется для сравнения двух строк и возвращает целочисленное значение.

   Если возвращаемое значение меньше 0, то первая строка меньше второй.

   Если возвращаемое значение больше 0, то первая строка больше второй.

   Если возвращается 0, то строки совпадают.

Под словом «меньше» подразумевается, что в таблице символов выбранный символ одной строки предшествует соответствующему выбранному символу другой строки. Сами строки сравниваются следующим образом: сначала сравниваются первые символы двух строк — если они совпадают, то сравнивается следующая пара символов и так до тех пор, пока не найдём отличающиеся символы или не переберём все символы до конца. С помощью метода compare() мы проведём 2 сравнения: учитывая и не учитывая регистр букв.

Результат выполнения программы выше:

Конвертация строк

Класс QString содержит следующие методы: toInt(), toFloat() и toLong(), которые позволяют преобразовать строку в типы int, float и long int соответственно. Метод setNum() позволяет конвертировать различные числовые данные в строку. Данный метод является перегруженным, поэтому компилятор сам позаботиться о том, чтобы вызвать подходящий вариант этого метода. В следующем примере мы конвертируем две строки в целочисленный тип данных, а затем добавляем их. После этого мы уже выполняем обратную конвертацию: из чисел в строки и опять добавляем их.

Результат выполнения программы выше:

Буквы

Символы можно разделить на несколько категорий: цифры, буквы, пробелы и знаки пунктуации. Напомню, что объекты класса QString состоят из элементов типа QChar. Тип QChar предоставляет нам методы isDigit(), isLetter(), isSpace() и isPunct(). В следующем примере мы, используя небольшую строку, подсчитаем количество цифр, букв, пробелов и знаков пунктуации, входящих в неё:

Результат выполнения программы выше:

Модификация строк

Одни методы (например, toLower()) возвращают новую модифицированную копию исходной строки. Другие методы модифицируют непосредственно исходную строку. Далее мы рассмотрим пример, в котором будет использоваться второй тип методов:

Результат выполнения программы выше:

Выравнивание строк

Для выравнивания строк используются методы leftJustified() и rightJustified(). В следующем примере мы выполним выравнивание строки по правому краю:

Результат выполнения программы выше:

Метод rightJustified() возвращает строку размером width, которая содержит символ-заполнитель, за которым следует строка. В нашем случае этим символом является символ пробела. Если строка короче, то остаток заполняется символом-заполнителем:

Управляющая последовательность символов

Qt5 содержит метод toHtmlEscaped(), который конвертирует обычную текстовую строку в HTML-строку, содержащую следующие HTML-метасимволы: <, >, &, и ", заменяя их HTML-мнемониками. Ниже представлена программа на языке C, код которой содержит HTML-метасимволы:

Наша следующая программа читает файл выше и заменяет HTML-метасимволы их HTML-мнемониками:

Результат выполнения программы выше:

На этом всё. До следующего урока!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 9

  1. Аватар Кирилл:

    Спасибо за урок! Жду следующий.

  2. Аватар artem:

    то что мне нужно, в рунете почти ничего нет по Qt

  3. Аватар Кирилл Триплкилл:

    Обычно не оставляю комментов, НО, тут исключительный случай! Выражаю лютую благодарность за то, что Вы, как немногие на рунете, начали выкладывать бесплатно уроки по Qt. Спасибо! Надеюсь, что будут затронуты многие возможности этой библиотеке в рамках этого курса!

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Спасибо большое 🙂

  4. Аватар Мгер:

    четвертый способ прохождения по контейнеру "стандартный for в стиле foreach":

    ЗЫ: как писать код в комментариях?

  5. Аватар Sergey:

    Добрый день! А что в данной IDE прописать чтоб вывод русских символов было не кириллицей?

    1. Дмитрий Бушуев Дмитрий Бушуев:

  6. Аватар Artur:

    Когда следующий урок?)

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Думаю, что в конце недели.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *