diff options
author | Wang Chuan <ouchuanm@outlook.com> | 2019-10-08 17:50:25 +0800 |
---|---|---|
committer | Wang Chuan <ouchuanm@outlook.com> | 2019-10-24 16:00:56 +0800 |
commit | 66de71b26a6c3b5be308c1a92287b6490164ae72 (patch) | |
tree | ac6121eb826904815d4ec71b17b1cb8be151bb2a /tests/auto/qquickmenubar/tst_qquickmenubar.cpp | |
parent | 78569ded1a6b9b660416bfc1208efecdfb1bdd51 (diff) |
QQuickMenuBar: let MenuBarItem lose highlight when Menu is dismissed
When adding new MenuBarItem to MenuBar, MenuBar will first check the
Menu pointer in MenuBarItem and then connect the Menu's signal [aboutToHide]
to MenuBar's slot [onMenuAboutToHide] to unhighlight the MenuBarItem.
In case of adding dynamic Menu, this operation will be performed before
setting new Menu to MenuBarItem. So the Menu pointer in MenuBarItem is
null, and the connection will not be performed.
[ChangeLog][Controls][QQuickMenuBar] Fixed issue with dynamically menu bar
items not losing their highlight when their menu was dismissed.
Fixes: QTBUG-77306
Change-Id: Ibe987462505f65747b4290b3c206e9dfbcbbef57
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'tests/auto/qquickmenubar/tst_qquickmenubar.cpp')
-rw-r--r-- | tests/auto/qquickmenubar/tst_qquickmenubar.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp index 9a22d26f..2fb1a02b 100644 --- a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp +++ b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp @@ -60,6 +60,7 @@ private slots: void keys(); void mnemonics(); void addRemove(); + void checkHighlightWhenMenuDismissed(); }; void tst_qquickmenubar::delegate() @@ -564,6 +565,63 @@ void tst_qquickmenubar::addRemove() QVERIFY(menuBarItem1.isNull()); } +void tst_qquickmenubar::checkHighlightWhenMenuDismissed() +{ + if ((QGuiApplication::platformName() == QLatin1String("offscreen")) + || (QGuiApplication::platformName() == QLatin1String("minimal"))) + QSKIP("Mouse highlight not functional on offscreen/minimal platforms"); + + QQmlApplicationEngine engine(testFileUrl("checkHighlightWhenDismissed.qml")); + QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(engine.rootObjects().value(0))); + QVERIFY(window); + + centerOnScreen(window.data()); + moveMouseAway(window.data()); + QVERIFY(QTest::qWaitForWindowActive(window.data())); + + QQuickMenuBar *menuBar = window->findChild<QQuickMenuBar *>("menuBar"); + QVERIFY(menuBar); + + QQuickMenu *staticMenu = menuBar->menuAt(0); + QQuickMenu *dynamicMenu = menuBar->menuAt(1); + QVERIFY(staticMenu && dynamicMenu); + QQuickMenuBarItem *staticMenuBarItem = qobject_cast<QQuickMenuBarItem *>(staticMenu->parentItem()); + QQuickMenuBarItem *dynamicMenuBarItem = qobject_cast<QQuickMenuBarItem *>(dynamicMenu->parentItem()); + QVERIFY(staticMenuBarItem && dynamicMenuBarItem); + + // highlight the static MenuBarItem and open the menu + QTest::mouseMove(window.data(), staticMenuBarItem->mapToScene( + QPointF(staticMenuBarItem->width() / 2, staticMenuBarItem->height() / 2)).toPoint()); + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + staticMenuBarItem->mapToScene(QPointF(staticMenuBarItem->width() / 2, staticMenuBarItem->height() / 2)).toPoint()); + QCOMPARE(staticMenuBarItem->isHighlighted(), true); + QCOMPARE(staticMenu->isVisible(), true); + QTRY_COMPARE(staticMenu->isOpened(), true); + + // click a menu item to dismiss the menu and unhighlight the static MenuBarItem + QQuickMenuItem *menuItem = qobject_cast<QQuickMenuItem *>(staticMenu->itemAt(0)); + QVERIFY(menuItem); + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + menuItem->mapToScene(QPointF(menuItem->width() / 2, menuItem->height() / 2)).toPoint()); + QCOMPARE(staticMenuBarItem->isHighlighted(), false); + + // highlight the dynamic MenuBarItem and open the menu + QTest::mouseMove(window.data(), dynamicMenuBarItem->mapToScene( + QPointF(dynamicMenuBarItem->width() / 2, dynamicMenuBarItem->height() / 2)).toPoint()); + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + dynamicMenuBarItem->mapToScene(QPointF(dynamicMenuBarItem->width() / 2, dynamicMenuBarItem->height() / 2)).toPoint()); + QCOMPARE(dynamicMenuBarItem->isHighlighted(), true); + QCOMPARE(dynamicMenu->isVisible(), true); + QTRY_COMPARE(dynamicMenu->isOpened(), true); + + // click a menu item to dismiss the menu and unhighlight the dynamic MenuBarItem + menuItem = qobject_cast<QQuickMenuItem *>(dynamicMenu->itemAt(0)); + QVERIFY(menuItem); + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + menuItem->mapToScene(QPointF(menuItem->width() / 2, menuItem->height() / 2)).toPoint()); + QCOMPARE(dynamicMenuBarItem->isHighlighted(), false); +} + QTEST_QUICKCONTROLS_MAIN(tst_qquickmenubar) #include "tst_qquickmenubar.moc" |