QShortcut: Fall back to cross platform code in absence of QPA menu

On macOS, absence of a QPA menu means that we should be using our
own internal logic since there's no entity on the QCocoaMenuDelegate
to take care of the shortcuts.

Change-Id: I35ed8f0b55445f61d0528709d4debb636a502002
Task-number: QTBUG-61039
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
Gabriel de Dietrich 2017-10-11 18:42:32 -07:00
parent 49da5ce100
commit 198225983d
2 changed files with 31 additions and 1 deletions

View File

@ -289,8 +289,10 @@ static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidge
// not the QMenu.) Since we can also reach this code by climbing the menu
// hierarchy (see below), or when the shortcut is not a key-equivalent, we
// need to check whether the QPA menu is actually disabled.
// When there is no QPA menu, there will be no QCocoaMenuDelegate checking
// for the actual shortcuts. We can then fallback to our own logic.
QPlatformMenu *pm = menu->platformMenu();
if (!pm || !pm->isEnabled())
if (pm && !pm->isEnabled())
continue;
#endif
QAction *a = menu->menuAction();

View File

@ -133,6 +133,7 @@ private slots:
void menuSize_Scrolling_data();
void menuSize_Scrolling();
void tearOffMenuNotDisplayed();
void QTBUG_61039_menu_shortcuts();
protected slots:
void onActivated(QAction*);
@ -1609,5 +1610,32 @@ void tst_QMenu::tearOffMenuNotDisplayed()
QVERIFY(!torn->isVisible());
}
void tst_QMenu::QTBUG_61039_menu_shortcuts()
{
QAction *actionKamen = new QAction("Action Kamen");
actionKamen->setShortcut(QKeySequence(QLatin1String("K")));
QAction *actionJoe = new QAction("Action Joe");
actionJoe->setShortcut(QKeySequence(QLatin1String("Ctrl+J")));
QMenu menu;
menu.addAction(actionKamen);
menu.addAction(actionJoe);
QVERIFY(!menu.platformMenu());
QWidget widget;
widget.addAction(menu.menuAction());
widget.show();
QVERIFY(QTest::qWaitForWindowActive(&widget));
QSignalSpy actionKamenSpy(actionKamen, &QAction::triggered);
QTest::keyClick(&widget, Qt::Key_K);
QTRY_COMPARE(actionKamenSpy.count(), 1);
QSignalSpy actionJoeSpy(actionJoe, &QAction::triggered);
QTest::keyClick(&widget, Qt::Key_J, Qt::ControlModifier);
QTRY_COMPARE(actionJoeSpy.count(), 1);
}
QTEST_MAIN(tst_QMenu)
#include "tst_qmenu.moc"