diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index c3b37553f54..40f427e5371 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -3381,6 +3381,8 @@ void QMenu::keyPressEvent(QKeyEvent *e) if (d->actionRects.at(i).isNull()) continue; QAction *act = d->actions.at(i); + if (!act->isEnabled() || act->isSeparator()) + continue; QKeySequence sequence = QKeySequence::mnemonic(act->text()); int key = sequence[0].toCombined() & 0xffff; // suspicious if (key == c.unicode()) { diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 52f24505dc0..f3e3eb44b7b 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -117,6 +117,9 @@ private slots: void nestedTearOffDetached(); void closeMenuOnClickIfMouseHasntMoved(); +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) + void dontSelectDisabledActionByShortcut(); +#endif void invisibleActions(); @@ -2179,5 +2182,28 @@ void tst_QMenu::invisibleActions() QVERIFY(!contextMenu.exec()); } +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) +void tst_QMenu::dontSelectDisabledActionByShortcut() +{ + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); + + QMainWindow w; + auto mb = w.menuBar(); + auto m = mb->addMenu("me&nu"); + auto zero = m->addAction("placeholder"); + auto first = m->addAction("disabled &o"); + auto second = m->addAction(QStringLiteral("enabled &o")); + + QSignalSpy spy(second, &QAction::triggered); + first->setDisabled(true); + w.show(); + QVERIFY(QTest::qWaitForWindowActive(&w)); + QTest::keyClick(&w, Qt::Key_N, Qt::AltModifier); + QTest::keyClick(m, Qt::Key_O, Qt::NoModifier); + QCOMPARE(spy.count(), 1); +} +#endif + QTEST_MAIN(tst_QMenu) #include "tst_qmenu.moc"