diff options
author | Yuya Nishihara <yuya.nishihara@qt.io> | 2020-08-28 18:32:20 +0900 |
---|---|---|
committer | Yuya Nishihara <yuya.nishihara@qt.io> | 2020-09-02 10:44:40 +0900 |
commit | de007e507ca2693203d15506aede3294e6236a83 (patch) | |
tree | 8055b3e144555ae2be90e28009e65c0d21cfebaa /tests/auto/qquickmenubar | |
parent | 704c009d839f69ad02a4112f1c0450a6d0d44096 (diff) |
Menu: Close menu by Alt key on platforms supporting mnemonic shortcuts
This is close to what the widget QMenu (and Windows native menu) do.
Before, the active menu was left open and Alt+<key> shortcut would be
delivered to one of the matching items, which might be an item shadowed
by the active menu popup.
With this patch, the active menu is closed on Alt key pressed so the
subsequent shortcut event will (likely) be delivered to the matching
MenuBar item. Since I'm going to fix the issue of &mnemonic key conflict
resolution, I need to first change the way of delivering a shortcut
event to the parent MenuBar.
The test cases use the undocumented function to simulate low-level
behavior of Alt itself and Alt+<key> events. Apparently, there's no
public QTest function to send multiple key events without releasing Alt
modifier.
Task-number: QTBUG-86276
Pick-to: 5.15
Change-Id: I0ed6ea94f0fee7983a5cb6352d388036d3a1f8df
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'tests/auto/qquickmenubar')
-rw-r--r-- | tests/auto/qquickmenubar/tst_qquickmenubar.cpp | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp index 2fb1a02b..62cb7363 100644 --- a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp +++ b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp @@ -418,6 +418,8 @@ void tst_qquickmenubar::mnemonics() moveMouseAway(window.data()); QVERIFY(QTest::qWaitForWindowActive(window.data())); + MnemonicKeySimulator keySim(window.data()); + QQuickMenuBar *menuBar = window->property("header").value<QQuickMenuBar *>(); QVERIFY(menuBar); @@ -434,30 +436,35 @@ void tst_qquickmenubar::mnemonics() QVERIFY(fileMenuBarItem && editMenuBarItem && viewMenuBarItem && helpMenuBarItem); // trigger a menubar item to open a menu - QTest::keyClick(window.data(), Qt::Key_E, Qt::AltModifier); // "&Edit" + keySim.press(Qt::Key_Alt); + keySim.click(Qt::Key_E); // "&Edit" + keySim.release(Qt::Key_Alt); QVERIFY(editMenuBarItem->isHighlighted()); QVERIFY(!editMenuBarItem->hasActiveFocus()); QVERIFY(editMenuBarMenu->isVisible()); QTRY_VERIFY(editMenuBarMenu->isOpened()); QVERIFY(editMenuBarMenu->hasActiveFocus()); - // re-trigger a menubar item to hide the menu - QTest::keyClick(window.data(), Qt::Key_E, Qt::AltModifier); // "&Edit" - QVERIFY(editMenuBarItem->isHighlighted()); - QVERIFY(editMenuBarItem->hasActiveFocus()); + // press Alt to hide the menu + keySim.click(Qt::Key_Alt); + QVERIFY(!editMenuBarItem->isHighlighted()); + QVERIFY(!editMenuBarItem->hasActiveFocus()); QVERIFY(!editMenuBarMenu->hasActiveFocus()); QTRY_VERIFY(!editMenuBarMenu->isVisible()); // re-trigger a menubar item to show the menu again - QTest::keyClick(window.data(), Qt::Key_E, Qt::AltModifier); // "&Edit" + keySim.press(Qt::Key_Alt); + keySim.click(Qt::Key_E); // "&Edit" + keySim.release(Qt::Key_Alt); QVERIFY(editMenuBarItem->isHighlighted()); QVERIFY(editMenuBarMenu->isVisible()); QTRY_VERIFY(editMenuBarMenu->isOpened()); QVERIFY(editMenuBarMenu->hasActiveFocus()); QVERIFY(!editMenuBarItem->hasActiveFocus()); - // trigger another menubar item to open another menu - QTest::keyClick(window.data(), Qt::Key_H, Qt::AltModifier); // "&Help" + // trigger another menubar item to open another menu, leave Alt pressed + keySim.press(Qt::Key_Alt); + keySim.click(Qt::Key_H); // "&Help" QVERIFY(!editMenuBarItem->isHighlighted()); QVERIFY(helpMenuBarItem->isHighlighted()); QVERIFY(!viewMenuBarMenu->isVisible()); @@ -465,40 +472,43 @@ void tst_qquickmenubar::mnemonics() QTRY_VERIFY(helpMenuBarMenu->isOpened()); // trigger a menu item to close the menu - QTest::keyClick(window.data(), Qt::Key_A, Qt::AltModifier); // "&About" + keySim.click(Qt::Key_A); // "&About" + keySim.release(Qt::Key_Alt); QVERIFY(!helpMenuBarItem->isHighlighted()); QTRY_VERIFY(!helpMenuBarMenu->isVisible()); - // trigger a menubar item to open a menu - QTest::keyClick(window.data(), Qt::Key_V, Qt::AltModifier); // "&View" + // trigger a menubar item to open a menu, leave Alt pressed + keySim.press(Qt::Key_Alt); + keySim.click(Qt::Key_V); // "&View" QVERIFY(!editMenuBarItem->isHighlighted()); QVERIFY(viewMenuBarItem->isHighlighted()); QVERIFY(viewMenuBarMenu->isVisible()); QTRY_VERIFY(viewMenuBarMenu->isOpened()); - // trigger a menu item to open a sub-menu + // trigger a menu item to open a sub-menu, leave Alt pressed QQuickMenuItem *alignmentSubMenuItem = qobject_cast<QQuickMenuItem *>(viewMenuBarMenu->itemAt(0)); QVERIFY(alignmentSubMenuItem); QQuickMenu *alignmentSubMenu = alignmentSubMenuItem->subMenu(); QVERIFY(alignmentSubMenu); - QTest::keyClick(window.data(), Qt::Key_A, Qt::AltModifier); // "&Alignment" + keySim.click(Qt::Key_A); // "&Alignment" QVERIFY(viewMenuBarMenu->isVisible()); QVERIFY(alignmentSubMenu->isVisible()); QTRY_VERIFY(alignmentSubMenu->isOpened()); - // trigger a menu item to open a sub-sub-menu + // trigger a menu item to open a sub-sub-menu, leave Alt pressed QQuickMenuItem *verticalSubMenuItem = qobject_cast<QQuickMenuItem *>(alignmentSubMenu->itemAt(1)); QVERIFY(verticalSubMenuItem); QQuickMenu *verticalSubMenu = verticalSubMenuItem->subMenu(); QVERIFY(verticalSubMenu); - QTest::keyClick(window.data(), Qt::Key_V, Qt::AltModifier); // "&Vertical" + keySim.click(Qt::Key_V); // "&Vertical" QVERIFY(viewMenuBarMenu->isVisible()); QVERIFY(alignmentSubMenu->isVisible()); QVERIFY(verticalSubMenu->isVisible()); QTRY_VERIFY(verticalSubMenu->isOpened()); // trigger a menu item to close the whole chain of menus - QTest::keyClick(window.data(), Qt::Key_C, Qt::AltModifier); // "&Center" + keySim.click(Qt::Key_C); // "&Center" + keySim.release(Qt::Key_Alt); QVERIFY(!viewMenuBarItem->isHighlighted()); QTRY_VERIFY(!viewMenuBarMenu->isVisible()); QTRY_VERIFY(!alignmentSubMenu->isVisible()); |