From 82e6ac8cdb4eed2cfaae7b5b5541e1cb99b812d0 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 28 Jun 2017 11:18:43 +0200 Subject: 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 --- src/widgets/dialogs/qinputdialog.cpp | 61 ++++++++++++++++++++++ src/widgets/dialogs/qinputdialog.h | 8 +++ .../dialogs/qinputdialog/tst_qinputdialog.cpp | 43 +++++++++++++++ 3 files changed, 112 insertions(+) diff --git a/src/widgets/dialogs/qinputdialog.cpp b/src/widgets/dialogs/qinputdialog.cpp index 04d13045e5..4c0f22ae97 100644 --- a/src/widgets/dialogs/qinputdialog.cpp +++ b/src/widgets/dialogs/qinputdialog.cpp @@ -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 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) diff --git a/src/widgets/dialogs/qinputdialog.h b/src/widgets/dialogs/qinputdialog.h index 5f06785886..e41d442498 100644 --- a/src/widgets/dialogs/qinputdialog.h +++ b/src/widgets/dialogs/qinputdialog.h @@ -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); diff --git a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp index 4ea0de5ab9..a0273513f7 100644 --- a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp +++ b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp @@ -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(); + QVERIFY(sbox); + QTest::keyClick(sbox, Qt::Key_Up); +} + +void tst_QInputDialog::setDoubleStep_data() +{ + QTest::addColumn("min"); + QTest::addColumn("max"); + QTest::addColumn("decimals"); + QTest::addColumn("doubleStep"); + QTest::addColumn("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(), + doubleStep); + QVERIFY(ok); + QCOMPARE(result, actualResult); +} + QTEST_MAIN(tst_QInputDialog) #include "tst_qinputdialog.moc" -- cgit v1.2.3