БлогNot. Qt: фильтрация строк без алфавитно-цифровых символов или как создать простой вид...

Qt: фильтрация строк без алфавитно-цифровых символов или как создать простой виджет

Коллеги вчера спрашивали, речь шла о том, как в приложении QT фильтровать содержимое многострочного текстового поля, например, чтобы в нём остались только строки, содержащие хотя бы один алфавитно-цифровой символ.

Заметки блога о работе со списком строк QStringList и применении текстовых поля ввода плюс регулярных выражений уже дают ответ на заданный вопрос, но меня просили ещё и опубликовать совсем простую пошаговую инструкцию по созданию такого виджета.

Что ж, вот инструкция с картинками и по шагам. Предположим что бесплатный комплект open-source QT скачан и установлен, а среда QT Creator запущена.

1. Нажать в QT Creator комбинацию клавиш Ctrl+N или выбрать меню Файл - Новый файл или проект...

Создание приложения QT Widgets
Создание приложения QT Widgets

2. Ввести название виджета и путь, по которому будут размещены файлы, нажать "Далее".

Название виджета
Название виджета

3. Убедиться, что выбран хотя бы один комплект для компиляции и сборки проекта, нажать "Далее".

Выбор комплекта
Выбор комплекта

4. Выбрать базовый класс QWidget, нажать "Далее". Будет создан проект со стандартным окном Windows без дополнительных элементов.

Выбор базового класса
Выбор базового класса

5. Контроль версий можно не добавлять, нажать "Завершить".

Завершение создания проекта
Завершение создания проекта

6. В окне "Проекты" раскрыть список "Формы" и открыть двойным щелчком форму widget.ui

Открытие формы
Открытие формы

7. Мы перешли в режим дизайна формы, из полосы с элементами интерфейса перетащим на форму кнопку Push Button и многострочное поле ввода Text Edit, разместим их как на рисунке.

Добавление элементов интерфейса
Добавление элементов интерфейса

8. Обведём при нажатой левой кнопке мыши поле ввода и нашу кнопку, затем нажмём комбинацию клавиш Ctrl+L или выберем пункт меню Инструменты - Редактор форм - Скомпоновать по вертикали.

Компоновка элементов интерфейса
Компоновка элементов интерфейса

9. Щёлкнем на форме вне красной рамки, потом нажмём комбинацию клавиш Ctrl+H или выберем пункт меню Инструменты - Редактор форм - Скомпоновать по горизонтали.

Можно также сделать двойной щелчок по надписи PushButton и заменить её на что-нибудь осмысленное, например, "Выполнить".

Растягивание элементов интерфейса по форме
Растягивание элементов интерфейса по форме

10. Нажмём правой кнопкой мыши на кнопке "Выполнить" и выберем пункт меню "Перейти к слоту", в окне "Переход к слоту" уже выбран сигнал clicked() (он испускается, когда нажата кнопка), жмём ОК.

Переход к слоту
Переход к слоту

11. Мы создали обработчик щелчка по кнопке и вернулись в окно ввода кода, текстовый курсор находится внутри только что созданной функции on_pushButton_clicked() класса Widget.

Ввод кода функции
Ввод кода функции

12. Наша обработка будет состоять всего из 4 шагов.

12.1. Получить текст из многострочного поля textEdit в строку типа QString

12.2. Разбить строку на части по разделителю "перевод строки" и положить в список строк типа QStringList

12.3. С помощью метода filter убрать из списка лишние строки, отобранные с помощью регулярного выражения

12.4. Объединить содержимое отфильтрованного списка в строку с помощью метода join и поместить данные обратно в textEdit

Вот соответствующие операторы, вписанные на место расположения текстового курсора :)

QString s = ui->textEdit->toPlainText();
QStringList lst=s.split("\n");
lst = lst.filter(QRegExp("\\s*\\w+\\s*"));
ui->textEdit->setText(lst.join("\n"));

13. Остаётся нажать комбинацию клавиш Ctrl+R или зеленый треугольничек слева внизу, чтобы запустить виджет.

Запуск виджета и ввод данных
Запуск виджета и ввод данных

После нажатия кнопки от показанных на картинке данных в поле ввода осталось

Абра
123
т
е
с
т 

Здесь мы фильтровали по регулярному выражению со смыслом "в строке есть хотя бы один алфавитно-цифровой символ".

Выражение "с начала строки до конца есть не только разделители" выглядит как

QRegExp("^(?!\\s*$).+")

и использует опережающую негативную проверку.

Освоив синтаксис регулярных выражений PCRE (см., например, статью по ссылке), который практически не отличается во всех современных языках, Вы сможете экономично решать задачи на обработку строк со сколь угодно сложными шаблонами.

P.S. Замена QRegExp на QRegularExpression в Qt6.

 Создаём простой виджет в Qt6 - аналогичная инструкция для 6-й версии фреймворка (файл .pdf) (442 Кб)

 Скачать проект Qt6 из этой статьи в архиве .zip, развернуть в новую папку проекта (2 Кб)

28.02.2018, 10:29 [3872 просмотра]


теги: textprocessing c++ программирование учебное список qt

К этой статье пока нет комментариев, Ваш будет первым