From 5271b36672c18cf3c1e530adb6ce2fc85c44469c Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sun, 19 Aug 2018 18:06:53 +0200 Subject: [PATCH] Implement QRegularExpression overload for QPlainTextEdit::find This patch adds the missing overload for QRegularExpression to match the QRegExp one for QPlainTextEdit. [ChangeLog][QtWidgets][QPlainTextEdit] Added QRegularExpression find() method overload. Change-Id: Id156971d3fa0372712bfa8b72a55550942a767e0 Reviewed-by: Luca Beldi Reviewed-by: David Faure --- src/widgets/widgets/qplaintextedit.cpp | 21 +++++++++ src/widgets/widgets/qplaintextedit.h | 4 ++ .../qplaintextedit/tst_qplaintextedit.cpp | 44 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index e54b28a045..36a150396c 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -2923,6 +2923,27 @@ bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) } #endif +/*! + \fn bool QTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) + + \since 5.13 + \overload + + Finds the next occurrence, matching the regular expression, \a exp, using the given + \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload, + use QRegularExpression::CaseInsensitiveOption instead. + + Returns \c true if a match was found and changes the cursor to select the match; + otherwise returns \c false. +*/ +#if QT_CONFIG(regularexpression) +bool QPlainTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) +{ + Q_D(QPlainTextEdit); + return d->control->find(exp, options); +} +#endif + /*! \fn void QPlainTextEdit::copyAvailable(bool yes) diff --git a/src/widgets/widgets/qplaintextedit.h b/src/widgets/widgets/qplaintextedit.h index e5ac4c82b8..a5945d649a 100644 --- a/src/widgets/widgets/qplaintextedit.h +++ b/src/widgets/widgets/qplaintextedit.h @@ -60,6 +60,7 @@ class QMenu; class QPlainTextEditPrivate; class QMimeData; class QPagedPaintDevice; +class QRegularExpression; class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea { @@ -149,6 +150,9 @@ public: #ifndef QT_NO_REGEXP bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); #endif +#if QT_CONFIG(regularexpression) + bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); +#endif inline QString toPlainText() const { return document()->toPlainText(); } diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp index b66e30ad35..be19cbc9d1 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp +++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp @@ -139,6 +139,11 @@ private slots: void findWithRegExp(); void findBackwardWithRegExp(); void findWithRegExpReturnsFalseIfNoMoreResults(); +#endif +#if QT_CONFIG(regularexpression) + void findWithRegularExpression(); + void findBackwardWithRegularExpression(); + void findWithRegularExpressionReturnsFalseIfNoMoreResults(); #endif void layoutAfterMultiLineRemove(); void undoCommandRemovesAndReinsertsBlock(); @@ -1582,6 +1587,45 @@ void tst_QPlainTextEdit::findWithRegExpReturnsFalseIfNoMoreResults() } #endif +#if QT_CONFIG(regularexpression) +void tst_QPlainTextEdit::findWithRegularExpression() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QRegularExpression rx("\\w{2}xt"); + + bool found = ed->find(rx); + + QVERIFY(found); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} + +void tst_QPlainTextEdit::findBackwardWithRegularExpression() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QTextCursor cursor = ed->textCursor(); + cursor.movePosition(QTextCursor::End); + ed->setTextCursor(cursor); + QRegularExpression rx("a\\w*t"); + + bool found = ed->find(rx, QTextDocument::FindBackward); + + QVERIFY(found); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("arbit")); +} + +void tst_QPlainTextEdit::findWithRegularExpressionReturnsFalseIfNoMoreResults() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QRegularExpression rx("t.xt"); + ed->find(rx); + + bool found = ed->find(rx); + + QVERIFY(!found); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} +#endif + void tst_QPlainTextEdit::layoutAfterMultiLineRemove() { ed->setVisible(true); // The widget must be visible to reproduce this bug.