В связи с этим небольшой вопрос по форуму и немного свободного времени сегодня. Отвечу в виде статьи о том, как выделить в QTextEdit все слова, которые нужно найти в этом тексте.
Чтобы реализовать эту функциональность, вам нужно будет использовать QSyntaxHighighter , как если бы вы писали код подсветки синтаксиса. Вот, кстати, пример подсветки синтаксиса для HTML .
И вот пример.
Структура проекта
Виджет
Главное окно приложения представлено виджетом.
Класс виджета состоит из нескольких файлов.
- 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: // Slot to handle the pressing of the button to install the desired text void onSearchText(); void onSearchText(); Ui::Widget *ui; // Inherited class for creating syntax highlighting logic 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); // Create and initialize search highlighting m_searchHighLight = new SearchHighLight(ui->textEdit->document()); // We connect the signal of the button to the slots for calling the search. connect(ui->pushButton, &QPushButton::clicked, this, &Widget::onSearchText); } Widget::~Widget() { delete ui; } void Widget::onSearchText() { // We load the text for search in syntax highlighting 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; // Regular expression to search for, in our case, this word or text QTextCharFormat m_format; // Text formatting, highlighting }; #endif // SEARCHHIGHLIGHT_H
SearchHightLight.cpp
#include "SearchHighLight.h" #include <QTextCharFormat> SearchHighLight::SearchHighLight(QTextDocument* parent) : BaseClass(parent) { // Set the backlight color m_format.setBackground(Qt::green); } void SearchHighLight::highlightBlock(const QString& text) { // Using a regular expression, we find all matches. QRegularExpressionMatchIterator matchIterator = m_pattern.globalMatch(text); while (matchIterator.hasNext()) { // Highlight all matches QRegularExpressionMatch match = matchIterator.next(); setFormat(match.capturedStart(), match.capturedLength(), m_format); } } void SearchHighLight::searchText(const QString& text) { // Set the text as a regular expression. m_pattern = QRegularExpression(text); rehighlight(); // Restart the backlight }
Вывод
И в заключение ссылка на репозиторий Git с этим примером.