summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dietrich-de@nokia.com>2010-01-12 14:09:42 (GMT)
committerGabriel de Dietrich <gabriel.dietrich-de@nokia.com>2010-01-12 14:40:41 (GMT)
commit12e320a7a3a5ca93dd5287315571db1d1728e322 (patch)
tree37e46eba29bf7e0524900a457cb342724245c133
parent4c85bf275c9d472a17cc9210aebf6eb880be740a (diff)
downloadQt-12e320a7a3a5ca93dd5287315571db1d1728e322.zip
Qt-12e320a7a3a5ca93dd5287315571db1d1728e322.tar.gz
Qt-12e320a7a3a5ca93dd5287315571db1d1728e322.tar.bz2
Significant digits were lost in QDoubleSpinBox range when changing precision
When setting the range, the actual value precision was lost because the min and max were saved after being formatted to the current precison (decimals property), thus losing information. We now keep the user original values, and use these whenever the decimals property is changed. Auto-test included. Reviewed-by: leo Task-number: QTBUG-6496
-rw-r--r--src/gui/widgets/qspinbox.cpp16
-rw-r--r--tests/auto/qdoublespinbox/tst_qdoublespinbox.cpp13
2 files changed, 26 insertions, 3 deletions
diff --git a/src/gui/widgets/qspinbox.cpp b/src/gui/widgets/qspinbox.cpp
index 50b225c..f382f96 100644
--- a/src/gui/widgets/qspinbox.cpp
+++ b/src/gui/widgets/qspinbox.cpp
@@ -99,6 +99,10 @@ public:
Q_Q(QDoubleSpinBox);
q->setInputMethodHints(Qt::ImhFormattedNumbersOnly);
}
+
+ // When fiddling with the decimals property, we may lose precision in these properties.
+ double actualMin;
+ double actualMax;
};
@@ -762,6 +766,7 @@ double QDoubleSpinBox::minimum() const
void QDoubleSpinBox::setMinimum(double minimum)
{
Q_D(QDoubleSpinBox);
+ d->actualMin = minimum;
const QVariant m(d->round(minimum));
d->setRange(m, (d->variantCompare(d->maximum, m) > 0 ? d->maximum : m));
}
@@ -792,6 +797,7 @@ double QDoubleSpinBox::maximum() const
void QDoubleSpinBox::setMaximum(double maximum)
{
Q_D(QDoubleSpinBox);
+ d->actualMax = maximum;
const QVariant m(d->round(maximum));
d->setRange((d->variantCompare(d->minimum, m) < 0 ? d->minimum : m), m);
}
@@ -813,6 +819,8 @@ void QDoubleSpinBox::setMaximum(double maximum)
void QDoubleSpinBox::setRange(double minimum, double maximum)
{
Q_D(QDoubleSpinBox);
+ d->actualMin = minimum;
+ d->actualMax = maximum;
d->setRange(QVariant(d->round(minimum)), QVariant(d->round(maximum)));
}
@@ -843,7 +851,7 @@ void QDoubleSpinBox::setDecimals(int decimals)
Q_D(QDoubleSpinBox);
d->decimals = qBound(0, decimals, DBL_MAX_10_EXP + DBL_DIG);
- setRange(minimum(), maximum()); // make sure values are rounded
+ setRange(d->actualMin, d->actualMax); // make sure values are rounded
setValue(value());
}
@@ -1051,8 +1059,10 @@ QVariant QSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
QDoubleSpinBoxPrivate::QDoubleSpinBoxPrivate()
{
- minimum = QVariant(0.0);
- maximum = QVariant(99.99);
+ actualMin = 0.0;
+ actualMax = 99.99;
+ minimum = QVariant(actualMin);
+ maximum = QVariant(actualMax);
value = minimum;
singleStep = QVariant(1.0);
decimals = 2;
diff --git a/tests/auto/qdoublespinbox/tst_qdoublespinbox.cpp b/tests/auto/qdoublespinbox/tst_qdoublespinbox.cpp
index a3f0915..35cffd6 100644
--- a/tests/auto/qdoublespinbox/tst_qdoublespinbox.cpp
+++ b/tests/auto/qdoublespinbox/tst_qdoublespinbox.cpp
@@ -149,6 +149,7 @@ private slots:
void taskQTBUG_5008_textFromValueAndValidate();
void taskQTBUG_6670_selectAllWithPrefix();
+ void taskQTBUG_6496_fiddlingWithPrecision();
public slots:
void valueChangedHelper(const QString &);
@@ -1096,5 +1097,17 @@ void tst_QDoubleSpinBox::taskQTBUG_6670_selectAllWithPrefix()
QCOMPARE(spin.value(), 12.);
}
+void tst_QDoubleSpinBox::taskQTBUG_6496_fiddlingWithPrecision()
+{
+ QDoubleSpinBox dsb;
+ dsb.setRange(0, 0.991);
+ dsb.setDecimals(1);
+ QCOMPARE(dsb.maximum(), 1.0);
+ dsb.setDecimals(2);
+ QCOMPARE(dsb.maximum(), 0.99);
+ dsb.setDecimals(3);
+ QCOMPARE(dsb.maximum(), 0.991);
+}
+
QTEST_MAIN(tst_QDoubleSpinBox)
#include "tst_qdoublespinbox.moc"