diff options
-rw-r--r-- | src/plugins/styles/android/qandroidstyle.cpp | 3 | ||||
-rw-r--r-- | src/widgets/styles/qcommonstyle.cpp | 3 | ||||
-rw-r--r-- | src/widgets/styles/qstyle.cpp | 4 | ||||
-rw-r--r-- | src/widgets/styles/qstyle.h | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qabstractspinbox.cpp | 3 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp | 63 |
6 files changed, 76 insertions, 1 deletions
diff --git a/src/plugins/styles/android/qandroidstyle.cpp b/src/plugins/styles/android/qandroidstyle.cpp index 1d9ce7e9b0..464f48b84b 100644 --- a/src/plugins/styles/android/qandroidstyle.cpp +++ b/src/plugins/styles/android/qandroidstyle.cpp @@ -677,6 +677,9 @@ int QAndroidStyle::styleHint(QStyle::StyleHint hint, const QStyleOption *option, case SH_RequestSoftwareInputPanel: return RSIP_OnMouseClick; + case SH_SpinBox_SelectOnStep: + return 0; + default: return QFusionStyle::styleHint(hint, option, widget, returnData); } diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 6f6ddfec44..cdd061f8d5 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -5393,6 +5393,9 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget case SH_TabBar_AllowWheelScrolling: ret = true; break; + case SH_SpinBox_SelectOnStep: + ret = true; + break; default: ret = 0; break; diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 8946b9d90e..b901b4b08e 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -1853,6 +1853,10 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, spinbox mouse clicks. \value SH_SpinBox_ClickAutoRepeatThreshold Auto-repeat threshold for spinbox mouse clicks. + \value SH_SpinBox_SelectOnStep Whether changing the value using + the buttons or up/down keys automatically selects the text. This enum + value has been introduced in Qt 6.3. + \value SH_ToolTipLabel_Opacity An integer indicating the opacity for the tip label, 0 is completely transparent, 255 is completely opaque. diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h index 6d094cc4f2..03f6fc1562 100644 --- a/src/widgets/styles/qstyle.h +++ b/src/widgets/styles/qstyle.h @@ -737,6 +737,7 @@ public: SH_SpinBox_StepModifier, SH_TabBar_AllowWheelScrolling, SH_Table_AlwaysDrawLeftTopGridLines, + SH_SpinBox_SelectOnStep, // Add new style hint values here SH_CustomBase = 0xf0000000 diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp index fc01354046..d49483db69 100644 --- a/src/widgets/widgets/qabstractspinbox.cpp +++ b/src/widgets/widgets/qabstractspinbox.cpp @@ -671,7 +671,8 @@ void QAbstractSpinBox::stepBy(int steps) } else if (e == AlwaysEmit) { d->emitSignals(e, old); } - selectAll(); + if (style()->styleHint(QStyle::SH_SpinBox_SelectOnStep, nullptr, this, nullptr)) + selectAll(); } /*! diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index c877454440..fc3412f387 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -130,6 +130,28 @@ public: Qt::KeyboardModifier stepModifier = Qt::ControlModifier; }; +class SelectAllOnStepStyle : public QProxyStyle +{ +public: + SelectAllOnStepStyle(bool selectAll) + : selectAll(selectAll) + {} + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option, + const QWidget *widget, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_SelectOnStep: + return selectAll; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } + +private: + const bool selectAll; +}; + class tst_QSpinBox : public QObject { Q_OBJECT @@ -210,6 +232,10 @@ private slots: void stepModifierPressAndHold_data(); void stepModifierPressAndHold(); + + void stepSelectAll_data(); + void stepSelectAll(); + public slots: void textChangedHelper(const QString &); void valueChangedHelper(int); @@ -1855,5 +1881,42 @@ void tst_QSpinBox::stepModifierPressAndHold() QCOMPARE(value.toInt(), spy.length() * expectedStepModifier); } +void tst_QSpinBox::stepSelectAll_data() +{ + QTest::addColumn<bool>("stepShouldSelectAll"); + QTest::addColumn<QStringList>("selectedText"); + + QTest::addRow("select all") << true << QStringList{"1", "0", "5", "4", "9"}; + QTest::addRow("don't select all") << false << QStringList{{}, {}, {}, {}, "94"}; +} + +void tst_QSpinBox::stepSelectAll() +{ + QFETCH(bool, stepShouldSelectAll); + QFETCH(QStringList, selectedText); + SelectAllOnStepStyle style(stepShouldSelectAll); + + SpinBox spinBox; + spinBox.setStyle(&style); + + QCOMPARE(spinBox.lineEdit()->selectedText(), QString()); + + auto it = selectedText.cbegin(); + spinBox.stepUp(); + QCOMPARE(spinBox.lineEdit()->selectedText(), *(it++)); + spinBox.lineEdit()->deselect(); + spinBox.stepDown(); + QCOMPARE(spinBox.lineEdit()->selectedText(), *(it++)); + spinBox.lineEdit()->deselect(); + spinBox.stepBy(5); + QCOMPARE(spinBox.lineEdit()->selectedText(), *(it++)); + spinBox.lineEdit()->deselect(); + QTest::keyClick(&spinBox, Qt::Key_Down); + QCOMPARE(spinBox.lineEdit()->selectedText(), *(it++)); + QTest::keyClicks(&spinBox, "9"); + QCOMPARE(spinBox.lineEdit()->selectedText(), QString()); + QCOMPARE(spinBox.lineEdit()->text(), *(it++)); +} + QTEST_MAIN(tst_QSpinBox) #include "tst_qspinbox.moc" |