Qt/C++ - Урок 088. Поиск текста с подсветкой в виджете QTextEdit

QTextEdit, Qt

В связи с небольшим вопросом на форуме и слегка свободным временем сегодня. Отвечу в виде статьи на то, как подсветить в QTextEdit все слова, которые надо в данном тексте найти.

Для реализации подобного функционала потребуется использовать QSyntaxHighighter , как если бы писали подсветку синтаксиса кода. Вот здесь кстати пример подсветки синтаксиса кода для HTML .

А вот так будет выглядеть пример.

Search text highlight

Структура проекта

Search Hightlight structure

Widget

Главное окно приложения представлено виджетом.

Класс виджета составляют несколько файлов

  • Widget.ui
  • Widget.h
  • Widget.cpp

Не буду вдаваться в подробности, как собрать подобное окно в Qt Designer, но в результате работы с Qt Designer получится файл Widget.ui.

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class SearchHighLight;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    // Слот для обработки нажатия кнопки по установке искомого текста
    void onSearchText();

    Ui::Widget *ui;
    // Наследованный класс для создания логики подсветки синтаксиса
    SearchHighLight* m_searchHighLight;
};

#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include "ui_Widget.h"

#include "SearchHighLight.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    // Создаём и инициализируем подсветку поиска
    m_searchHighLight = new SearchHighLight(ui->textEdit->document());

    // Подключаем сигнал кнопки к слоты для вызова поиска
    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::onSearchText);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onSearchText()
{
    // Загружаем текст для поиска в подсветку синтаксиса
    m_searchHighLight->searchText(ui->lineEdit->text());
}

SearchHightLight

А теперь самое интересное, как именно можно реализовать подсветку текста в поиске с использованием QSyntaxHighligher

SearchHightLight.h

#ifndef SEARCHHIGHLIGHT_H
#define SEARCHHIGHLIGHT_H

#include <QSyntaxHighlighter>
#include <QRegularExpression>

class SearchHighLight : public QSyntaxHighlighter
{
    Q_OBJECT
    using BaseClass = QSyntaxHighlighter;
public:
    explicit SearchHighLight(QTextDocument* parent = nullptr);

    void searchText(const QString& text);

protected:
    virtual void highlightBlock(const QString &text) override;

private:
    QRegularExpression m_pattern; // Регулярное выражение для поиска, в нашем случае это слово или текст
    QTextCharFormat m_format;     // Форматирование текста, подсветка
};

#endif // SEARCHHIGHLIGHT_H

SearchHightLight.cpp

#include "SearchHighLight.h"

#include <QTextCharFormat>

SearchHighLight::SearchHighLight(QTextDocument* parent) : BaseClass(parent)
{
    // Устанавливаем цвет подсветки
    m_format.setBackground(Qt::green);
}

void SearchHighLight::highlightBlock(const QString& text)
{
    // С помощью регулярного выражения находим все совпадения
    QRegularExpressionMatchIterator matchIterator = m_pattern.globalMatch(text);
    while (matchIterator.hasNext())
    {
        // Подсвечиваем все совпадения
        QRegularExpressionMatch match = matchIterator.next();
        setFormat(match.capturedStart(), match.capturedLength(), m_format);
    }
}

void SearchHighLight::searchText(const QString& text)
{
    // Устанавливаем текст в виде регулярного выражения
    m_pattern = QRegularExpression(text);
    rehighlight(); // Перезапускаем подсветку
}

Заключение

А в качестве заключения ссылка на Git репозиторий с данным примером.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
D
16 августа 2019 г. 12:58
Damir

C++ - Тест 003. Условия и циклы

  • Результат:92баллов,
  • Очки рейтинга8
D
16 августа 2019 г. 12:46
Damir

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
u
14 августа 2019 г. 14:55
unrealproro

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
D
17 августа 2019 г. 9:04
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
13 августа 2019 г. 10:43
Евгений Легоцкой

Самая главная проблема в том, что у вас это константные переменные, и инициализируется они один единственный раз при запуске программы. Поэтому делать динамический перевод в таком случае у …
Сейчас обсуждают на форуме
18 августа 2019 г. 3:22
Ruslan Polupan

Т.е. таблицы в БД к которым обращается приложение могут отсутсвовать?
15 августа 2019 г. 3:19
Михаиллл

Плюсы и qml отличаются, с++ логичней
14 августа 2019 г. 8:20
Евгений Легоцкой

Да это не столько баги QML, сколько поведение JavaScript, который используется в нём. Из-за отсутствия строгой типизации получаем некоторые проблемы с преобразованием типов. в итоге, на первый в…
14 августа 2019 г. 2:33
BlinCT

Ошибка найдена) недосмотрел.
13 августа 2019 г. 3:52
Евгений Легоцкой

Бери остаток от деления #include <QCoreApplication>#include <QTime>#include <QDebug>int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QTime time…
Ищу работу?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB