diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index f3f9d0b5aad14c23970aed81115bcc825e2544cc..37b103613d5c5349691b891deb98bab14037db43 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1199,7 +1199,7 @@ void QQuickTextInput::setInputMask(const QString &im) bool QQuickTextInput::hasAcceptableInput() const { Q_D(const QQuickTextInput); - return d->hasAcceptableInput(d->m_text) == QQuickTextInputPrivate::AcceptableInput; + return d->m_acceptableInput; } /*! @@ -2589,7 +2589,7 @@ void QQuickTextInputPrivate::handleFocusEvent(QFocusEvent *event) && !persistentSelection) deselect(); - if (q->hasAcceptableInput() || fixup()) + if (hasAcceptableInput(m_text) == AcceptableInput || fixup()) emit q->editingFinished(); #ifndef QT_NO_IM @@ -3415,6 +3415,27 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo } } #endif + + if (m_maskData) { + if (m_text.length() != m_maxLength) { + m_acceptableInput = false; + } else { + for (int i = 0; i < m_maxLength; ++i) { + if (m_maskData[i].separator) { + if (m_text.at(i) != m_maskData[i].maskChar) { + m_acceptableInput = false; + break; + } + } else { + if (!isValidInput(m_text.at(i), m_maskData[i].maskChar)) { + m_acceptableInput = false; + break; + } + } + } + } + } + if (validateFromState >= 0 && wasValidInput && !m_validInput) { if (m_transactions.count()) return false; @@ -4199,7 +4220,7 @@ void QQuickTextInputPrivate::processKeyEvent(QKeyEvent* event) Q_Q(QQuickTextInput); if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { - if (q->hasAcceptableInput() || fixup()) { + if (hasAcceptableInput(m_text) == AcceptableInput || fixup()) { emit q->accepted(); emit q->editingFinished(); } diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index fc1be16bc867ee01663dd1b2256ef0504b419915..e5ef83ba323ea152b955e3b4b438bfb8e675d1f1 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -6272,13 +6272,11 @@ void tst_qquicktextinput::hasAcceptableInputMask() textInput->setText(invalid); QVERIFY(textInput->hasAcceptableInput()); - // at the moment we don't strip the blank character if it is valid input, this makes the test between x vs X useless - QEXPECT_FAIL( "Any optional and required", "To eat blanks or not? Known issue. Task 43172", Abort); - // test requiredMask textInput->setInputMask(requiredMask); textInput->setText(invalid); - QVERIFY(!textInput->hasAcceptableInput()); + // invalid text gets the input mask applied when setting, text becomes acceptable. + QVERIFY(textInput->hasAcceptableInput()); textInput->setText(valid); QVERIFY(textInput->hasAcceptableInput());