Евгений Легоцкой13 декабря 2018 г. 16:13

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

Содержание

В связи с небольшим вопросом на форуме и слегка свободным временем сегодня. Отвечу в виде статьи на то, как подсветить в 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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
J

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
V
  • Vitreg
  • 26 октября 2020 г. 2:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
V
  • Vitreg
  • 26 октября 2020 г. 2:23

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

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

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.
S

QML - Урок 026. Intents с Qt для Android, часть 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
ВК

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
Сейчас обсуждают на форуме
D

LibreOffice QT Widget

Я бы хотел интегрировать приложения из LibreOffice в свою программу. В идеале использовать их как виджеты Наткнулся на пакет libreoffice-qt5, который вроде как позволяет это делать htt…

Создание черновика как на авито и тд

А черновик в свою очередь нужен пока только для получения id, который нужен для мультизагружки изображений и привязки их к посту. как то так... я бы вообще решал это так: class P…
  • Nomad
  • 1 октября 2020 г. 5:22

MyForm(forms.Form): - непонятка

понятно спасибо
S

QWebView android

На android не запускается, иначе я бы не создавал этот пост. Собственно, вопрос я решил сам, там ещё понадобилось setDomStorageEnabled(true) вызвать.

не могу передать стринг с QLineEdit

QLineEdit *myLineEdit = new QLineEdit("line edit name", this); QString str = myLineEdit->text();
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB