diff --git a/src/widgets/widgets/qgroupbox.cpp b/src/widgets/widgets/qgroupbox.cpp index 4bd49acad95..d5b471ff65a 100644 --- a/src/widgets/widgets/qgroupbox.cpp +++ b/src/widgets/widgets/qgroupbox.cpp @@ -43,6 +43,7 @@ public: void _q_fixFocus(Qt::FocusReason reason); void _q_setChildrenEnabled(bool b); void click(); + bool shouldHandleKeyEvent(const QKeyEvent *keyEvent) const; bool flat; bool checkable; bool checked; @@ -327,10 +328,7 @@ bool QGroupBox::event(QEvent *e) return true; case QEvent::KeyPress: { QKeyEvent *k = static_cast(e); - const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme() - ->themeHint(QPlatformTheme::ButtonPressKeys) - .value>(); - if (!k->isAutoRepeat() && buttonPressKeys.contains(k->key())) { + if (d->shouldHandleKeyEvent(k)) { d->pressedControl = QStyle::SC_GroupBoxCheckBox; update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)); return true; @@ -339,10 +337,7 @@ bool QGroupBox::event(QEvent *e) } case QEvent::KeyRelease: { QKeyEvent *k = static_cast(e); - const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme() - ->themeHint(QPlatformTheme::ButtonPressKeys) - .value>(); - if (!k->isAutoRepeat() && buttonPressKeys.contains(k->key())) { + if (d->shouldHandleKeyEvent(k)) { bool toggle = (d->pressedControl == QStyle::SC_GroupBoxLabel || d->pressedControl == QStyle::SC_GroupBoxCheckBox); d->pressedControl = QStyle::SC_None; @@ -728,6 +723,22 @@ void QGroupBox::mouseReleaseEvent(QMouseEvent *event) update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)); } + +bool QGroupBoxPrivate::shouldHandleKeyEvent(const QKeyEvent *keyEvent) const +{ + Q_Q(const QGroupBox); + Q_ASSERT(q->isEnabled()); + + if (!q->isCheckable() || keyEvent->isAutoRepeat()) + return false; + + const QList buttonPressKeys = QGuiApplicationPrivate::platformTheme() + ->themeHint(QPlatformTheme::ButtonPressKeys) + .value>(); + return buttonPressKeys.contains(keyEvent->key()); +} + + QT_END_NAMESPACE #include "moc_qgroupbox.cpp" diff --git a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp index b178707e7a0..1d825420f1c 100644 --- a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp +++ b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp @@ -603,6 +603,13 @@ void tst_QGroupBox::buttonPressKeys() QTest::keyClick(&groupBox, buttonPressKeys[i]); QCOMPARE(clickedSpy.size(), i + 1); } + + groupBox.setCheckable(false); + QSignalSpy notClickedSpy(&groupBox, &QGroupBox::clicked); + for (int i = 0; i < buttonPressKeys.size(); ++i) { + QTest::keyClick(&groupBox, buttonPressKeys[i]); + QCOMPARE(notClickedSpy.size(), 0); + } } void tst_QGroupBox::sendMouseMoveEvent(QWidget *widget, const QPoint &localPos)