Qt: как запустить проект с QRegExp в Qt6 без переделок кода
Проблема уже упоминалась вот здесь, но на практике переписывать приложения Qt 4-5 со сколько-нибудь реальным разбором текста, выполненным при помощи QRegExp, на Qt 6, где есть только QRegularExpression - занятие довольно трудоёмкое.
Проще добавить в проект собственный класс QRegExp, реализующий те немногие возможности стандартного QRegExp, что обычно применяются - у меня, например, в исходном проекте Qt5 использовались только методы indexIn и matchedLength. Основной класс проекта HtmlHighLighter, основанный на стандартном QSyntaxHighlighter, умеет разбирать HTML-разметку из текстового поля QTextEdit и подсвечивать разными цветами теги и атрибуты. Интерфейс приложения выполнен на основе этого проекта.
Ниже приводятся исходники "моего" класса QRegExp, скриншот приложения в работе и архив с проектом Qt6.
Файл qregexp.h
#ifndef QREGEXP_H #define QREGEXP_H #include <QRegularExpression> class QRegExp { public: QRegExp(); QRegExp(const QString &pattern); int indexIn(const QString &str, int offset = 0); int matchedLength(); private: QString pattern; int mLength; }; #endif // QREGEXP_H
Файл qregexp.cpp
#include "qregexp.h" QRegExp::QRegExp() { this->mLength = -1; } QRegExp::QRegExp(const QString &pattern) { this->pattern = pattern; } int QRegExp::indexIn(const QString &str, int offset) { //Найти совпадение в str со смещением позиции offset (по умолчанию 0). //Возвращает позицию первого совпадения или -1, если совпадений не было. QRegularExpression q (pattern); QRegularExpressionMatch match = q.match(str,offset); bool hasMatch = match.hasMatch(); if (!hasMatch) { this->mLength = -1; return -1; } int startOffset = match.capturedStart(); int endOffset = match.capturedEnd(); this->mLength = endOffset - startOffset; return startOffset; } int QRegExp::matchedLength() { //Длина последней совпавшей строки или -1, если совпадений не было. return this->mLength; }
Приложение HTML HighLighter в работе, скриншот
Скачать архив .zip с этим проектом Qt6, папка уже создана внутри архива (21 Кб)
Во многих случаях, если регулярка используется однократно, достаточно заменить ключевое слово QRegExp
на QRegularExpression
в описании выражения и соответствующем операторе #include
.
06.09.2022, 20:15 [919 просмотров]