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:
Jani Honkonen 2012-08-06 12:02:51 +03:00 committed by Qt by Nokia
parent 2ef52ca124
commit 547a1bea49
2 changed files with 54 additions and 2 deletions

View File

@ -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);
}
}
}

View File

@ -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"