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());