summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/styles/android/qandroidstyle.cpp3
-rw-r--r--src/widgets/styles/qcommonstyle.cpp3
-rw-r--r--src/widgets/styles/qstyle.cpp4
-rw-r--r--src/widgets/styles/qstyle.h1
-rw-r--r--src/widgets/widgets/qabstractspinbox.cpp3
-rw-r--r--tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp63
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"