diff options
-rw-r--r-- | src/gui/util/qvalidator.cpp | 21 | ||||
-rw-r--r-- | src/gui/util/qvalidator.h | 3 | ||||
-rw-r--r-- | tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp | 97 |
3 files changed, 105 insertions, 16 deletions
diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp index 52dfad11a4..14d9c01503 100644 --- a/src/gui/util/qvalidator.cpp +++ b/src/gui/util/qvalidator.cpp @@ -591,8 +591,8 @@ public: that accepts any double. */ -QDoubleValidator::QDoubleValidator(QObject * parent) - : QDoubleValidator(-HUGE_VAL, HUGE_VAL, 1000, parent) +QDoubleValidator::QDoubleValidator(QObject *parent) + : QDoubleValidator(-HUGE_VAL, HUGE_VAL, -1, parent) { } @@ -801,6 +801,9 @@ void QDoubleValidatorPrivate::fixupWithLocale(QString &input, QLocaleData::Numbe Sets the validator to accept doubles from \a minimum to \a maximum inclusive, with at most \a decimals digits after the decimal point. + + \note Setting the number of decimals to -1 effectively sets it to unlimited. + This is also the value used by a default-constructed validator. */ void QDoubleValidator::setRange(double minimum, double maximum, int decimals) @@ -828,6 +831,17 @@ void QDoubleValidator::setRange(double minimum, double maximum, int decimals) } /*! + \overload + + Sets the validator to accept doubles from \a minimum to \a maximum + inclusive without changing the number of digits after the decimal point. +*/ +void QDoubleValidator::setRange(double minimum, double maximum) +{ + setRange(minimum, maximum, decimals()); +} + +/*! \property QDoubleValidator::bottom \brief the validator's minimum acceptable value @@ -860,7 +874,8 @@ void QDoubleValidator::setTop(double top) \property QDoubleValidator::decimals \brief the validator's maximum number of digits after the decimal point - By default, this property contains a value of 1000. + By default, this property contains a value of -1, which means any number + of digits is accepted. \sa setRange() */ diff --git a/src/gui/util/qvalidator.h b/src/gui/util/qvalidator.h index be9042d653..7728857672 100644 --- a/src/gui/util/qvalidator.h +++ b/src/gui/util/qvalidator.h @@ -142,7 +142,8 @@ public: QValidator::State validate(QString &, int &) const override; void fixup(QString &input) const override; - void setRange(double bottom, double top, int decimals = 0); + void setRange(double bottom, double top, int decimals); + void setRange(double bottom, double top); void setBottom(double); void setTop(double); void setDecimals(int); diff --git a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp index 26fea94797..77d52682f6 100644 --- a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp +++ b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp @@ -47,6 +47,8 @@ private slots: void notifySignals(); void fixup(); void fixup_data(); + void setRangeOverloads(); + void setRangeOverloads_data(); }; Q_DECLARE_METATYPE(QValidator::State); @@ -162,6 +164,10 @@ void tst_QDoubleValidator::validate_data() QTest::newRow("data52") << "C" << 100.0 << 200.0 << 4 << QString("999.9999") << ITM << ITM; QTest::newRow("data53") << "C" << 0.0 << 2.0 << 2 << QString("9.9999") << INV << INV; QTest::newRow("data54") << "C" << 100.0 << 200.0 << 4 << QString("9999.9999") << ITM << INV; + QTest::newRow("data55") << "C" << 1229.0 << 1231.0 << -1 << QString("123E") << ITM << INV; + QTest::newRow("data56") << "C" << 1229.0 << 1231.0 << -1 << QString("123E+") << ITM << INV; + QTest::newRow("data57") << "C" << 1229.0 << 1231.0 << -1 << QString("123E+1") << ACC << INV; + QTest::newRow("data58") << "C" << 0.0 << 100.0 << -1 << QString("0.0") << ACC << ACC; QTest::newRow("data_de0") << "de" << 0.0 << 100.0 << 1 << QString("50,0") << ACC << ACC; QTest::newRow("data_de1") << "de" << 00.0 << 100.0 << 1 << QString("500,0") << ITM << ITM; @@ -252,9 +258,9 @@ void tst_QDoubleValidator::validate() QDoubleValidator dv(minimum, maximum, decimals, 0); int dummy; - QCOMPARE((int)dv.validate(value, dummy), (int)scientific_state); + QCOMPARE(dv.validate(value, dummy), scientific_state); dv.setNotation(QDoubleValidator::StandardNotation); - QCOMPARE((int)dv.validate(value, dummy), (int)standard_state); + QCOMPARE(dv.validate(value, dummy), standard_state); } void tst_QDoubleValidator::zeroPaddedExponent_data() @@ -308,7 +314,7 @@ void tst_QDoubleValidator::zeroPaddedExponent() QDoubleValidator dv(minimum, maximum, decimals, 0); dv.setLocale(locale); int dummy; - QCOMPARE((int)dv.validate(value, dummy), (int)state); + QCOMPARE(dv.validate(value, dummy), state); } void tst_QDoubleValidator::notifySignals() @@ -324,6 +330,10 @@ void tst_QDoubleValidator::notifySignals() qRegisterMetaType<QDoubleValidator::Notation>("QDoubleValidator::Notation"); QSignalSpy notSpy(&dv, SIGNAL(notationChanged(QDoubleValidator::Notation))); + QCOMPARE(dv.bottom(), 0.1); + QCOMPARE(dv.top(), 0.9); + QCOMPARE(dv.decimals(), 10); + dv.setTop(0.8); QCOMPARE(topSpy.count(), 1); QCOMPARE(changedSpy.count(), 1); @@ -336,11 +346,11 @@ void tst_QDoubleValidator::notifySignals() dv.setRange(0.2, 0.7); QCOMPARE(topSpy.count(), 2); QCOMPARE(bottomSpy.count(), 1); - QCOMPARE(decSpy.count(), 1); + QCOMPARE(decSpy.count(), 0); QCOMPARE(changedSpy.count(), 3); QCOMPARE(dv.bottom(), 0.2); QCOMPARE(dv.top(), 0.7); - QCOMPARE(dv.decimals(), 0); + QCOMPARE(dv.decimals(), 10); dv.setRange(0.3, 0.7); QCOMPARE(topSpy.count(), 2); @@ -348,7 +358,7 @@ void tst_QDoubleValidator::notifySignals() QCOMPARE(changedSpy.count(), 4); QCOMPARE(dv.bottom(), 0.3); QCOMPARE(dv.top(), 0.7); - QCOMPARE(dv.decimals(), 0); + QCOMPARE(dv.decimals(), 10); dv.setRange(0.4, 0.6); QCOMPARE(topSpy.count(), 3); @@ -356,18 +366,18 @@ void tst_QDoubleValidator::notifySignals() QCOMPARE(changedSpy.count(), 5); QCOMPARE(dv.bottom(), 0.4); QCOMPARE(dv.top(), 0.6); - QCOMPARE(dv.decimals(), 0); + QCOMPARE(dv.decimals(), 10); - dv.setDecimals(10); - QCOMPARE(decSpy.count(), 2); + dv.setDecimals(5); + QCOMPARE(decSpy.count(), 1); QCOMPARE(changedSpy.count(), 6); - QCOMPARE(dv.decimals(), 10); + QCOMPARE(dv.decimals(), 5); dv.setRange(0.4, 0.6, 100); QCOMPARE(topSpy.count(), 3); QCOMPARE(bottomSpy.count(), 3); - QCOMPARE(decSpy.count(), 3); + QCOMPARE(decSpy.count(), 2); QCOMPARE(changedSpy.count(), 7); QCOMPARE(dv.bottom(), 0.4); QCOMPARE(dv.top(), 0.6); @@ -381,7 +391,7 @@ void tst_QDoubleValidator::notifySignals() dv.setRange(dv.bottom(), dv.top(), dv.decimals()); QCOMPARE(topSpy.count(), 3); QCOMPARE(bottomSpy.count(), 3); - QCOMPARE(decSpy.count(), 3); + QCOMPARE(decSpy.count(), 2); QCOMPARE(changedSpy.count(), 8); dv.setNotation(dv.notation()); @@ -613,6 +623,69 @@ void tst_QDoubleValidator::fixup_data() << "-1.23456E+05"; } +void tst_QDoubleValidator::setRangeOverloads() +{ + QFETCH(QDoubleValidator::Notation, notation); + QFETCH(int, initialDecimals); + QFETCH(double, minimum); + QFETCH(double, maximum); + QFETCH(int, updatedDecimals); + QFETCH(QString, input); + QFETCH(QValidator::State, initDecimalsState); + QFETCH(QValidator::State, updDecimalsState); + + QDoubleValidator dv; + dv.setLocale(QLocale::C); + dv.setNotation(notation); + dv.setDecimals(initialDecimals); + dv.setRange(minimum, maximum); + QCOMPARE(dv.decimals(), initialDecimals); + + int dummy; + QCOMPARE(dv.validate(input, dummy), initDecimalsState); + + dv.setRange(minimum, maximum, updatedDecimals); + QCOMPARE(dv.decimals(), updatedDecimals); + QCOMPARE(dv.validate(input, dummy), updDecimalsState); +} + +void tst_QDoubleValidator::setRangeOverloads_data() +{ + QTest::addColumn<QDoubleValidator::Notation>("notation"); + QTest::addColumn<int>("initialDecimals"); + QTest::addColumn<double>("minimum"); + QTest::addColumn<double>("maximum"); + QTest::addColumn<int>("updatedDecimals"); + QTest::addColumn<QString>("input"); + QTest::addColumn<QValidator::State>("initDecimalsState"); + QTest::addColumn<QValidator::State>("updDecimalsState"); + + QTest::newRow("scientific, 0 digits after point") + << QDoubleValidator::ScientificNotation << -1 << -100.0 << 100.0 << 0 + << QString("1e1") << ACC << ACC; + QTest::newRow("scientific, 1 digits after point") + << QDoubleValidator::ScientificNotation << -1 << -100.0 << 100.0 << 0 + << QString("1.2e1") << ACC << INV; + QTest::newRow("scientific, 3 digits after point, not in range") + << QDoubleValidator::ScientificNotation << 3 << -100.0 << 100.0 << 1 + << QString("10.234e-1") << ACC << INV; + QTest::newRow("scientific, 3 digits after point, not in range") + << QDoubleValidator::ScientificNotation << 3 << -100.0 << 100.0 << 5 + << QString("1.234e3") << ITM << ITM; + QTest::newRow("standard, 0 digits after point") + << QDoubleValidator::StandardNotation << -1 << -100.0 << 100.0 << 0 + << QString("12.") << ACC << ACC; + QTest::newRow("standard, 2 digits after point") + << QDoubleValidator::StandardNotation << -1 << -100.0 << 100.0 << 1 + << QString("12.34") << ACC << INV; + QTest::newRow("standard, 2 digits after point, not in range") + << QDoubleValidator::StandardNotation << -1 << -100.0 << 100.0 << 1 + << QString("123.45") << ITM << INV; + QTest::newRow("standard, 5 digits after point") + << QDoubleValidator::StandardNotation << 5 << -100.0 << 100.0 << 3 + << QString("12.34567") << ACC << INV; +} + void tst_QDoubleValidator::validateIntEquiv_data() { QTest::addColumn<double>("minimum"); |