Урок №2. Строки в Qt5 и класс QString

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

  |

  Обновл. 16 Сен 2021  | 

 73507

 ǀ   28 

На этом уроке мы будем работать со строками. Для этого в 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++. Метод c_str() генерирует строку C-style. Данный массив символов, который является классическим способом представления строк в языке Си, может быть присвоен объекту класса QString:

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

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

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

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

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

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

Длина строк


Есть 3 метода, которые позволяют получить информацию о длине строки:

   size();

   count();

   length().

Все они делают одно и то же — возвращают количество символов в строке. В следующем примере мы выводим длину четырех строк:

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

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

Динамическое построение строк позволяет нам заменять определенные управляющие символы нужными нам значениями. Для этого используется метод 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 (121 оценок, среднее: 4,92 из 5)
Загрузка...

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

  1. Иван:

    Добрый день!

    При запуске проекта у меня не появляется черной консоли, есть результат в «Вывод приложения», а также в терминале, если поставить галочку в Проекты->Запускать в терминале. Но нет консольного окна как у Вас? Что можно сделать в этом случае?

  2. x4Stiing:

    Оказывается для того что бы это строчка работала:

    надо cprog.c запихнуть в папку build которая создается возле папки с проектом.
    Если располагать файл в папке проекта, то следует писать:

  3. ap0stole:

    Здравствуйте, делал по вашей инструкции, только на сегодняшний день пришлось скачать более новую версию. Тут отсутствует QStringRef. Нашел что его можно заменить QStringView.

    1. Centalia:

      В последний версиях Qt (6.2.2) класс QStringRef был перемещен из Qt6Core в Qt6Core5Compat. Чтобы класс заработал подключи Qt6Core5Compat.

  4. Владимир:

    Вроде бы доходчиво все объяснено, НО мне не понравилась последняя подтема, где было чтение из файла. Объяснено было только преобразование строки, а создание объекта файла, его открытие и создание потокового ввода для файла было будто проигнорировано. Пришлось лезть в официальную документацию и смотреть каждый класс и функцию по отдельности, чтобы все понять до конца.
    А так урок хороший, спасибо большое

  5. Victoria:

    Не могу понять почему endl работает. ( у меня не работает)
    Мы создали обьект оut для вывода обьектов QString, но endl мы не перегружали, почему он у вас в примере работает?

    1. Max:

      Попробуй Qt::endl

      1. Анатолий:

        Я бы даже предложил использовать

    2. Фото аватара Дмитрий Бушуев:

      >>Мы создали обьект оut для вывода обьектов QString, но endl мы не перегружали, почему он у вас в примере работает?

      Потому что мы использует не стандартный си-шный out, а out из подключенного заголовочного файла QTextStream. А в нём всё уже перегружено, как надо.

      >>Не могу понять почему endl работает. ( у меня не работает)
      Не знаю. Только что скомпилировал самый первый пример, всё работает (ниже прикрепил ссылку на скриншот):
      https://ibb.co/9TJpYn0

      P.S.: Да, компилятор ругался, что обычный endl уже устарел и его стоит заменить на Qt::endl, но у меня на Qt 5.15.2 всё нормально скомпилировалось и работает. Может у вас более новая версия, тогда попробуйте Qt::endl.

  6. Alex:

    Отлично! Многие рекомендуют .

    Но вот вопрос, как настроить компиляцию min-GW и сборку cmake с поддержкой 14 Стандарта плюсов в QT Creator?

  7. Gleb:

    Спасибо . очень интересно.
    Вопрос : где должен находиться файл cprog.c ?
    Qt под Windows.

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

      Добрый день.
      Вариант 1:
      Когда вы скомпилировали вашу программу, то рядом с папкой проекта должна появиться еще одна папка с названием типа:

      "build-НАЗВАНИЕ_ВАШЕГО_ПРОЕКТА-Desktop_Qt_5_13_0_MinGW_32_bit-Debug"

      Вот в неё и нужно положить файл cprog.c.

      Вариант 2:
      Файл может лежать где угодно, но тогда нужно прописать полный путь до него, заменив строчку:

      на

      1. Gleb:

        Спасибо ! Вариант 1 заработал !

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

          Всегда пожалуйста 🙂

  8. Вадим:

    Ну что скажу….прекрасно!… все четко и очень доходчиво…надеюсь и дальнейшие уроки так же изложены.. Спасибо!

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

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

  9. Jane:

    Куда в проект нужно положить файлик, прописанный в qfile. И как отобразить это в .pro?
    Положен в источники, но программа его там не видит. Ругается
    12:35:20: Starting D:\DOCUMENTS\jane_home\qt_experiments\String\install_2\debug\String_2.exe …
    12:35:20: The process failed to start. Either the invoked program "D:/DOCUMENTS/jane_home/qt_experiments/String/install_2/debug/String_2.exe" is missing, or you may have insufficient permissions to invoke the program.
    12:35:20: Cannot execute "": Не удается найти указанный файл.
    12:35:20: D:/DOCUMENTS/jane_home/qt_experiments/String/install_2/debug/String_2.exe exited with code -1

  10. Илья:

    Есть проблема. При создании проекта создаются 2 файла:
    main.cpp
    project000.qbs

    файла project000.pro не создаётся
    почему и как это исправить?

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

      Под какую ОС установлен Qt? Windows или Linux?

  11. Кирилл:

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

  12. artem:

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

  13. Кирилл Триплкилл:

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

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

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

  14. Мгер:

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

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

  15. Sergey:

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

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

  16. Artur:

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

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

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

Добавить комментарий для Gleb Отменить ответ

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