У зв'язку з цим невелике питання щодо форуму і трохи вільного часу сьогодні. Відповім у вигляді статті про те, як виділити у 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 з цим прикладом.