Implement setDoubleStep for QInputDialog

setDoubleStep works in the same manner as for setIntStep in that it is
just available for input dialogs getting a double.

[ChangeLog][QtWidgets][QInputDialog] Added setDoubleStep to enable
changing of the step amount for getDouble().

Task-number: QTBUG-17547
Change-Id: I5cabcfceb23324f8045f2b1e49017644418db01a
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Andy Shaw 2017-06-28 11:18:43 +02:00
parent 0721199187
commit 82e6ac8cdb
3 changed files with 112 additions and 0 deletions

View File

@ -1367,6 +1367,41 @@ int QInputDialog::getInt(QWidget *parent, const QString &title, const QString &l
double QInputDialog::getDouble(QWidget *parent, const QString &title, const QString &label,
double value, double min, double max, int decimals, bool *ok,
Qt::WindowFlags flags)
{
return QInputDialog::getDouble(parent, title, label, value, min, max, decimals, ok, flags, 1.0);
}
/*!
\overload
Static convenience function to get a floating point number from the user.
\a title is the text which is displayed in the title bar of the dialog.
\a label is the text which is shown to the user (it should say what should
be entered).
\a value is the default floating point number that the line edit will be
set to.
\a min and \a max are the minimum and maximum values the user may choose.
\a decimals is the maximum number of decimal places the number may have.
\a step is the amount by which the values change as the user presses the
arrow buttons to increment or decrement the value.
If \a ok is nonnull, *\a ok will be set to true if the user pressed \uicontrol OK
and to false if the user pressed \uicontrol Cancel. The dialog's parent is
\a parent. The dialog will be modal and uses the widget \a flags.
This function returns the floating point number which has been entered by
the user.
Use this static function like this:
\snippet dialogs/standarddialogs/dialog.cpp 1
\sa getText(), getInt(), getItem(), getMultiLineText()
*/
double QInputDialog::getDouble(QWidget *parent, const QString &title, const QString &label,
double value, double min, double max, int decimals, bool *ok,
Qt::WindowFlags flags, double step)
{
QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
dialog->setWindowTitle(title);
@ -1374,6 +1409,7 @@ double QInputDialog::getDouble(QWidget *parent, const QString &title, const QStr
dialog->setDoubleDecimals(decimals);
dialog->setDoubleRange(min, max);
dialog->setDoubleValue(value);
dialog->setDoubleStep(step);
const int ret = dialog->exec();
if (ok)
@ -1438,6 +1474,31 @@ QString QInputDialog::getItem(QWidget *parent, const QString &title, const QStri
}
}
/*!
\property QInputDialog::doubleStep
\since 5.10
\brief the step by which the double value is increased and decreased
This property is only relevant when the input dialog is used in
DoubleInput mode.
*/
void QInputDialog::setDoubleStep(double step)
{
Q_D(QInputDialog);
d->ensureDoubleSpinBox();
d->doubleSpinBox->setSingleStep(step);
}
double QInputDialog::doubleStep() const
{
Q_D(const QInputDialog);
if (d->doubleSpinBox)
return d->doubleSpinBox->singleStep();
else
return 1.0;
}
/*!
\fn void QInputDialog::doubleValueChanged(double value)

View File

@ -74,6 +74,7 @@ class Q_WIDGETS_EXPORT QInputDialog : public QDialog
QDOC_PROPERTY(int doubleDecimals READ doubleDecimals WRITE setDoubleDecimals)
QDOC_PROPERTY(QString okButtonText READ okButtonText WRITE setOkButtonText)
QDOC_PROPERTY(QString cancelButtonText READ cancelButtonText WRITE setCancelButtonText)
QDOC_PROPERTY(double doubleStep READ doubleStep WRITE setDoubleStep)
public:
enum InputDialogOption {
@ -178,6 +179,10 @@ public:
static double getDouble(QWidget *parent, const QString &title, const QString &label, double value = 0,
double minValue = -2147483647, double maxValue = 2147483647,
int decimals = 1, bool *ok = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags());
// ### Qt 6: merge overloads
static double getDouble(QWidget *parent, const QString &title, const QString &label, double value,
double minValue, double maxValue, int decimals, bool *ok, Qt::WindowFlags flags,
double step);
#if QT_DEPRECATED_SINCE(5, 0)
QT_DEPRECATED static inline int getInteger(QWidget *parent, const QString &title, const QString &label, int value = 0,
@ -188,6 +193,9 @@ public:
}
#endif
void setDoubleStep(double step);
double doubleStep() const;
Q_SIGNALS:
// ### emit signals!
void textValueChanged(const QString &text);

View File

@ -47,6 +47,7 @@ class tst_QInputDialog : public QObject
static void testFuncGetDouble(QInputDialog *dialog);
static void testFuncGetText(QInputDialog *dialog);
static void testFuncGetItem(QInputDialog *dialog);
static void testFuncSingleStepDouble(QInputDialog *dialog);
void timerEvent(QTimerEvent *event);
private slots:
void getInt_data();
@ -61,6 +62,8 @@ private slots:
void getItem();
void task256299_getTextReturnNullStringOnRejected();
void inputMethodHintsOfChildWidget();
void setDoubleStep_data();
void setDoubleStep();
};
QString stripFraction(const QString &s)
@ -482,5 +485,45 @@ void tst_QInputDialog::inputMethodHintsOfChildWidget()
QCOMPARE(editWidget->inputMethodHints(), Qt::ImhDigitsOnly);
}
void tst_QInputDialog::testFuncSingleStepDouble(QInputDialog *dialog)
{
QDoubleSpinBox *sbox = dialog->findChild<QDoubleSpinBox *>();
QVERIFY(sbox);
QTest::keyClick(sbox, Qt::Key_Up);
}
void tst_QInputDialog::setDoubleStep_data()
{
QTest::addColumn<double>("min");
QTest::addColumn<double>("max");
QTest::addColumn<int>("decimals");
QTest::addColumn<double>("doubleStep");
QTest::addColumn<double>("actualResult");
QTest::newRow("step 2.0") << 0.0 << 10.0 << 0 << 2.0 << 2.0;
QTest::newRow("step 2.5") << 0.5 << 10.5 << 1 << 2.5 << 3.0;
QTest::newRow("step 2.25") << 10.05 << 20.05 << 2 << 2.25 << 12.30;
QTest::newRow("step 2.25 fewer decimals") << 0.5 << 10.5 << 1 << 2.25 << 2.75;
}
void tst_QInputDialog::setDoubleStep()
{
QFETCH(double, min);
QFETCH(double, max);
QFETCH(int, decimals);
QFETCH(double, doubleStep);
QFETCH(double, actualResult);
QWidget p;
parent = &p;
doneCode = QDialog::Accepted;
testFunc = &tst_QInputDialog::testFuncSingleStepDouble;
startTimer(0);
bool ok = false;
const double result = QInputDialog::getDouble(parent, QString(), QString(), min, min,
max, decimals, &ok, QFlags<Qt::WindowType>(),
doubleStep);
QVERIFY(ok);
QCOMPARE(result, actualResult);
}
QTEST_MAIN(tst_QInputDialog)
#include "tst_qinputdialog.moc"