Implement helper function for handling key events in QGroupBox
A GroupBox would for its' checkbox accept a key event if this event was a part of buttonPressKeys. This would even happen if the QGroupBox wasn't checkable, which resulted with an unnecessarily consumed key event. Implement a helper function QGroupBoxPrivate::shouldHandleKeyEvent() that can be used to check if a key event should be accepted, and that takes into consideration if the QGroupBox is checkable. Fixes: QTBUG-129095 Change-Id: I21d1aa24b1b25b70d5274e2c13f887aefc80dbc5 Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
parent
1edea2defc
commit
5d397a262f
@ -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<QKeyEvent*>(e);
|
||||
const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme()
|
||||
->themeHint(QPlatformTheme::ButtonPressKeys)
|
||||
.value<QList<Qt::Key>>();
|
||||
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<QKeyEvent*>(e);
|
||||
const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme()
|
||||
->themeHint(QPlatformTheme::ButtonPressKeys)
|
||||
.value<QList<Qt::Key>>();
|
||||
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<Qt::Key> buttonPressKeys = QGuiApplicationPrivate::platformTheme()
|
||||
->themeHint(QPlatformTheme::ButtonPressKeys)
|
||||
.value<QList<Qt::Key>>();
|
||||
return buttonPressKeys.contains(keyEvent->key());
|
||||
}
|
||||
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "moc_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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user