diff options
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 18 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p.h | 4 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 10 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index c1e30a95ea..ce2492d07a 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1053,14 +1053,32 @@ void QQuickTextInput::setValidator(QValidator* v) if (d->m_validator == v) return; + if (d->m_validator) { + qmlobject_disconnect( + d->m_validator, QValidator, SIGNAL(changed()), + this, QQuickTextInput, SLOT(q_validatorChanged())); + } + d->m_validator = v; + if (d->m_validator) { + qmlobject_connect( + d->m_validator, QValidator, SIGNAL(changed()), + this, QQuickTextInput, SLOT(q_validatorChanged())); + } + if (isComponentComplete()) d->checkIsValid(); emit validatorChanged(); } +void QQuickTextInput::q_validatorChanged() +{ + Q_D(QQuickTextInput); + d->checkIsValid(); +} + #endif // QT_NO_VALIDATOR void QQuickTextInputPrivate::checkIsValid() diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index fb21eb910b..16faa01fc8 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -340,6 +340,10 @@ private Q_SLOTS: void q_updateAlignment(); void triggerPreprocess(); +#ifndef QT_NO_VALIDATOR + void q_validatorChanged(); +#endif + private: friend class QQuickTextUtil; diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index 73cf2d3aaa..d2d8d5ad14 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -2031,6 +2031,16 @@ void tst_qquicktextinput::validators() QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblSpy.count(), 3); + // Changing the validator properties will re-evaluate whether the input is acceptable. + intValidator->setTop(10); + QCOMPARE(dblInput->property("acceptable").toBool(), false); + QCOMPARE(dblInput->hasAcceptableInput(), false); + QCOMPARE(dblSpy.count(), 4); + intValidator->setTop(12); + QCOMPARE(dblInput->property("acceptable").toBool(), true); + QCOMPARE(dblInput->hasAcceptableInput(), true); + QCOMPARE(dblSpy.count(), 5); + QQuickTextInput *strInput = qobject_cast<QQuickTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("strInput"))); QVERIFY(strInput); QSignalSpy strSpy(strInput, SIGNAL(acceptableInputChanged())); |