Fix limitting shortcuts to keypad only
The Qt::KeypadModifier modifier is internally masked away from all shortcuts. So it is not possible to set a keypad only shortcut. Changed the implementation so that first a full keysequence match is searched. Then if no match is found the same sequence is tried without the keypad modifer. Added a autotest for this also to cover the basic use cases relating to this. Task-number: QTBUG-20191 Change-Id: Ibe7740c705fd0ab1eece4809b9a0b48882172933 Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com> Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
parent
2ef52ca124
commit
547a1bea49
@ -381,6 +381,12 @@ QKeySequence::SequenceMatch QShortcutMap::nextState(QKeyEvent *e)
|
||||
d->identicals.resize(0);
|
||||
|
||||
result = find(e);
|
||||
if (result == QKeySequence::NoMatch && (e->modifiers() & Qt::KeypadModifier)) {
|
||||
// Try to find a match without keypad modifier
|
||||
QKeyEvent event = *e;
|
||||
event.setModifiers(e->modifiers() & ~Qt::KeypadModifier);
|
||||
result = find(&event);
|
||||
}
|
||||
if (result == QKeySequence::NoMatch && e->modifiers() & Qt::ShiftModifier) {
|
||||
// If Shift + Key_Backtab, also try Shift + Qt::Key_Tab
|
||||
if (e->key() == Qt::Key_Backtab) {
|
||||
@ -570,8 +576,7 @@ void QShortcutMap::createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl)
|
||||
curKsl.setKey(0, 2);
|
||||
curKsl.setKey(0, 3);
|
||||
}
|
||||
// Filtering keycode here with 0xdfffffff to ignore the Keypad modifier
|
||||
curKsl.setKey(possibleKeys.at(pkNum) & 0xdfffffff, index);
|
||||
curKsl.setKey(possibleKeys.at(pkNum), index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -85,6 +85,7 @@ private slots:
|
||||
void defaultAndAutoDefault();
|
||||
void sizeHint_data();
|
||||
void sizeHint();
|
||||
void taskQTBUG_20191_shortcutWithKeypadModifer();
|
||||
/*
|
||||
void state();
|
||||
void group();
|
||||
@ -658,5 +659,51 @@ void tst_QPushButton::sizeHint()
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer()
|
||||
{
|
||||
// setup a dialog with two buttons
|
||||
QPushButton *button1 = new QPushButton("5");
|
||||
QPushButton *button2 = new QPushButton("5 + KeypadModifier");
|
||||
QVBoxLayout *layout = new QVBoxLayout();
|
||||
layout->addWidget(button1);
|
||||
layout->addWidget(button2);
|
||||
QDialog dialog;
|
||||
dialog.setLayout(layout);
|
||||
dialog.show();
|
||||
QTest::qWaitForWindowShown(&dialog);
|
||||
QApplication::setActiveWindow(&dialog);
|
||||
|
||||
// add shortcut '5' to button1 and test with keyboard and keypad '5' keys
|
||||
QSignalSpy spy1(button1, SIGNAL(clicked()));
|
||||
button1->setShortcut(Qt::Key_5);
|
||||
QTest::keyClick(&dialog, Qt::Key_5);
|
||||
QTest::qWait(300);
|
||||
QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier);
|
||||
QTest::qWait(300);
|
||||
QCOMPARE(spy1.count(), 2);
|
||||
|
||||
// add shortcut 'keypad 5' to button2
|
||||
spy1.clear();
|
||||
QSignalSpy spy2(button2, SIGNAL(clicked()));
|
||||
button2->setShortcut(Qt::Key_5 + Qt::KeypadModifier);
|
||||
QTest::keyClick(&dialog, Qt::Key_5);
|
||||
QTest::qWait(300);
|
||||
QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier);
|
||||
QTest::qWait(300);
|
||||
QCOMPARE(spy1.count(), 1);
|
||||
QCOMPARE(spy2.count(), 1);
|
||||
|
||||
// remove shortcut from button1
|
||||
spy1.clear();
|
||||
spy2.clear();
|
||||
button1->setShortcut(QKeySequence());
|
||||
QTest::keyClick(&dialog, Qt::Key_5);
|
||||
QTest::qWait(300);
|
||||
QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier);
|
||||
QTest::qWait(300);
|
||||
QCOMPARE(spy1.count(), 0);
|
||||
QCOMPARE(spy2.count(), 1);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QPushButton)
|
||||
#include "tst_qpushbutton.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user