From c0d30db45ca0af9c3010097d8cd8b1ae92cf83ea Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Wed, 18 Jan 2012 13:04:21 +1000 Subject: Add a changed() signal to QValidator. This provides a general notification of changes that may change the validity of previously validated input. Change-Id: I5ec6f127af60fdca68605fee903a08758bc01360 Reviewed-by: Jonas Gastal Reviewed-by: Lars Knoll --- src/gui/util/qvalidator.cpp | 25 +++++++++++++++++++- src/gui/util/qvalidator.h | 3 +++ .../qdoublevalidator/tst_qdoublevalidator.cpp | 27 ++++++++++++++++++++++ .../widgets/qintvalidator/tst_qintvalidator.cpp | 20 ++++++++++++++++ .../qregexpvalidator/tst_qregexpvalidator.cpp | 2 ++ 5 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp index b4478cfaa5..d806a18b64 100644 --- a/src/gui/util/qvalidator.cpp +++ b/src/gui/util/qvalidator.cpp @@ -131,6 +131,12 @@ QT_BEGIN_NAMESPACE \omitvalue Valid */ +/*! + \fn void QValidator::changed() + + This signal is emitted when any property that may affect the validity of + a string has changed. +*/ /*! \fn void QIntValidator::topChanged(int top) @@ -247,7 +253,10 @@ QLocale QValidator::locale() const void QValidator::setLocale(const QLocale &locale) { Q_D(QValidator); - d->locale = locale; + if (d->locale != locale) { + d->locale = locale; + emit changed(); + } } /*! @@ -452,15 +461,21 @@ void QIntValidator::fixup(QString &input) const void QIntValidator::setRange(int bottom, int top) { + bool rangeChanged = false; if (b != bottom) { b = bottom; + rangeChanged = true; emit bottomChanged(b); } if (t != top) { t = top; + rangeChanged = true; emit topChanged(t); } + + if (rangeChanged) + emit changed(); } @@ -697,20 +712,26 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL void QDoubleValidator::setRange(double minimum, double maximum, int decimals) { + bool rangeChanged = false; if (b != minimum) { b = minimum; + rangeChanged = true; emit bottomChanged(b); } if (t != maximum) { t = maximum; + rangeChanged = true; emit topChanged(t); } if (dec != decimals) { dec = decimals; + rangeChanged = true; emit decimalsChanged(dec); } + if (rangeChanged) + emit changed(); } /*! @@ -772,6 +793,7 @@ void QDoubleValidator::setNotation(Notation newNotation) if (d->notation != newNotation) { d->notation = newNotation; emit notationChanged(d->notation); + emit changed(); } } @@ -888,6 +910,7 @@ void QRegExpValidator::setRegExp(const QRegExp& rx) if (r != rx) { r = rx; emit regExpChanged(r); + emit changed(); } } diff --git a/src/gui/util/qvalidator.h b/src/gui/util/qvalidator.h index 0ae0e52833..a5f6beec55 100644 --- a/src/gui/util/qvalidator.h +++ b/src/gui/util/qvalidator.h @@ -76,6 +76,9 @@ public: virtual State validate(QString &, int &) const = 0; virtual void fixup(QString &) const; +Q_SIGNALS: + void changed(); + protected: QValidator(QObjectPrivate &d, QObject *parent); QValidator(QValidatorPrivate &d, QObject *parent); diff --git a/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp index 743955eee3..d503e2e84f 100644 --- a/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp +++ b/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp @@ -247,25 +247,31 @@ void tst_QDoubleValidator::validate() } void tst_QDoubleValidator::notifySignals() { + QLocale::setDefault(QLocale("C")); + QDoubleValidator dv(0.1, 0.9, 10, 0); QSignalSpy topSpy(&dv, SIGNAL(topChanged(double))); QSignalSpy bottomSpy(&dv, SIGNAL(bottomChanged(double))); QSignalSpy decSpy(&dv, SIGNAL(decimalsChanged(int))); + QSignalSpy changedSpy(&dv, SIGNAL(changed())); qRegisterMetaType("QDoubleValidator::Notation"); QSignalSpy notSpy(&dv, SIGNAL(notationChanged(QDoubleValidator::Notation))); dv.setTop(0.8); QCOMPARE(topSpy.count(), 1); + QCOMPARE(changedSpy.count(), 1); QVERIFY(dv.top() == 0.8); dv.setBottom(0.2); QCOMPARE(bottomSpy.count(), 1); + QCOMPARE(changedSpy.count(), 2); QVERIFY(dv.bottom() == 0.2); dv.setRange(0.2, 0.7); QCOMPARE(topSpy.count(), 2); QCOMPARE(bottomSpy.count(), 1); QCOMPARE(decSpy.count(), 1); + QCOMPARE(changedSpy.count(), 3); QVERIFY(dv.bottom() == 0.2); QVERIFY(dv.top() == 0.7); QVERIFY(dv.decimals() == 0.); @@ -273,6 +279,7 @@ void tst_QDoubleValidator::notifySignals() dv.setRange(0.3, 0.7); QCOMPARE(topSpy.count(), 2); QCOMPARE(bottomSpy.count(), 2); + QCOMPARE(changedSpy.count(), 4); QVERIFY(dv.bottom() == 0.3); QVERIFY(dv.top() == 0.7); QVERIFY(dv.decimals() == 0.); @@ -280,12 +287,14 @@ void tst_QDoubleValidator::notifySignals() dv.setRange(0.4, 0.6); QCOMPARE(topSpy.count(), 3); QCOMPARE(bottomSpy.count(), 3); + QCOMPARE(changedSpy.count(), 5); QVERIFY(dv.bottom() == 0.4); QVERIFY(dv.top() == 0.6); QVERIFY(dv.decimals() == 0.); dv.setDecimals(10); QCOMPARE(decSpy.count(), 2); + QCOMPARE(changedSpy.count(), 6); QVERIFY(dv.decimals() == 10.); @@ -293,13 +302,31 @@ void tst_QDoubleValidator::notifySignals() QCOMPARE(topSpy.count(), 3); QCOMPARE(bottomSpy.count(), 3); QCOMPARE(decSpy.count(), 3); + QCOMPARE(changedSpy.count(), 7); QVERIFY(dv.bottom() == 0.4); QVERIFY(dv.top() == 0.6); QVERIFY(dv.decimals() == 100.); dv.setNotation(QDoubleValidator::StandardNotation); QCOMPARE(notSpy.count(), 1); + QCOMPARE(changedSpy.count(), 8); QVERIFY(dv.notation() == QDoubleValidator::StandardNotation); + + dv.setRange(dv.bottom(), dv.top(), dv.decimals()); + QCOMPARE(topSpy.count(), 3); + QCOMPARE(bottomSpy.count(), 3); + QCOMPARE(decSpy.count(), 3); + QCOMPARE(changedSpy.count(), 8); + + dv.setNotation(dv.notation()); + QCOMPARE(notSpy.count(), 1); + QCOMPARE(changedSpy.count(), 8); + + dv.setLocale(QLocale("C")); + QCOMPARE(changedSpy.count(), 8); + + dv.setLocale(QLocale("en")); + QCOMPARE(changedSpy.count(), 9); } void tst_QDoubleValidator::validateIntEquiv_data() diff --git a/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp b/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp index 1094f1a1b5..27ded409a5 100644 --- a/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp +++ b/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp @@ -231,33 +231,53 @@ void tst_QIntValidator::validate() void tst_QIntValidator::notifySignals() { + QLocale::setDefault(QLocale("C")); + QIntValidator iv(0, 10, 0); QSignalSpy topSpy(&iv, SIGNAL(topChanged(int))); QSignalSpy bottomSpy(&iv, SIGNAL(bottomChanged(int))); + QSignalSpy changedSpy(&iv, SIGNAL(changed())); + iv.setTop(9); QCOMPARE(topSpy.count(), 1); + QCOMPARE(changedSpy.count(), 1); QVERIFY(iv.top() == 9); iv.setBottom(1); QCOMPARE(bottomSpy.count(), 1); + QCOMPARE(changedSpy.count(), 2); QVERIFY(iv.bottom() == 1); iv.setRange(1, 8); QCOMPARE(topSpy.count(), 2); QCOMPARE(bottomSpy.count(), 1); + QCOMPARE(changedSpy.count(), 3); QVERIFY(iv.top() == 8); QVERIFY(iv.bottom() == 1); iv.setRange(2, 8); QCOMPARE(topSpy.count(), 2); QCOMPARE(bottomSpy.count(), 2); + QCOMPARE(changedSpy.count(), 4); QVERIFY(iv.top() == 8); QVERIFY(iv.bottom() == 2); iv.setRange(3, 7); QCOMPARE(topSpy.count(), 3); QCOMPARE(bottomSpy.count(), 3); + QCOMPARE(changedSpy.count(), 5); QVERIFY(iv.top() == 7); QVERIFY(iv.bottom() == 3); + + iv.setRange(3, 7); + QCOMPARE(topSpy.count(), 3); + QCOMPARE(bottomSpy.count(), 3); + QCOMPARE(changedSpy.count(), 5); + + iv.setLocale(QLocale("C")); + QCOMPARE(changedSpy.count(), 5); + + iv.setLocale(QLocale("en")); + QCOMPARE(changedSpy.count(), 6); } QTEST_MAIN(tst_QIntValidator) diff --git a/tests/auto/widgets/widgets/qregexpvalidator/tst_qregexpvalidator.cpp b/tests/auto/widgets/widgets/qregexpvalidator/tst_qregexpvalidator.cpp index 6fcf066a0f..ce072af45a 100644 --- a/tests/auto/widgets/widgets/qregexpvalidator/tst_qregexpvalidator.cpp +++ b/tests/auto/widgets/widgets/qregexpvalidator/tst_qregexpvalidator.cpp @@ -113,11 +113,13 @@ void tst_QRegExpValidator::validate() QRegExpValidator rv( 0 ); QSignalSpy spy(&rv, SIGNAL(regExpChanged(const QRegExp&))); + QSignalSpy changedSpy(&rv, SIGNAL(changed())); rv.setRegExp( QRegExp( rx ) ); int dummy; QCOMPARE( (int)rv.validate( value, dummy ), state ); QCOMPARE(spy.count(), 1); + QCOMPARE(changedSpy.count(), 1); } QTEST_MAIN(tst_QRegExpValidator) -- cgit v1.2.3