diff options
-rw-r--r-- | src/quicktemplates2/qquickmenubar.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar_p_p.h | 2 | ||||
-rw-r--r-- | tests/auto/qquickmenubar/tst_qquickmenubar.cpp | 60 |
3 files changed, 65 insertions, 5 deletions
diff --git a/src/quicktemplates2/qquickmenubar.cpp b/src/quicktemplates2/qquickmenubar.cpp index 62205b6e..9be9ee09 100644 --- a/src/quicktemplates2/qquickmenubar.cpp +++ b/src/quicktemplates2/qquickmenubar.cpp @@ -95,7 +95,7 @@ void QQuickMenuBarPrivate::createItems() } } -QQuickItem *QQuickMenuBarPrivate::beginCreateItem() +QQuickItem *QQuickMenuBarPrivate::beginCreateItem(QQuickMenu *menu) { Q_Q(QQuickMenuBar); if (!delegate) @@ -115,6 +115,8 @@ QQuickItem *QQuickMenuBarPrivate::beginCreateItem() return nullptr; } + if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item)) + menuBarItem->setMenu(menu); item->setParentItem(q); QQml_setParent_noEvent(item, q); @@ -131,9 +133,7 @@ void QQuickMenuBarPrivate::completeCreateItem() QQuickItem *QQuickMenuBarPrivate::createItem(QQuickMenu *menu) { - QQuickItem *item = beginCreateItem(); - if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item)) - menuBarItem->setMenu(menu); + QQuickItem *item = beginCreateItem(menu); completeCreateItem(); return item; } diff --git a/src/quicktemplates2/qquickmenubar_p_p.h b/src/quicktemplates2/qquickmenubar_p_p.h index 4d5e61e6..8623ef43 100644 --- a/src/quicktemplates2/qquickmenubar_p_p.h +++ b/src/quicktemplates2/qquickmenubar_p_p.h @@ -71,7 +71,7 @@ public: void createItems(); - QQuickItem *beginCreateItem(); + QQuickItem *beginCreateItem(QQuickMenu *menu); void completeCreateItem(); QQuickItem *createItem(QQuickMenu *menu); diff --git a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp index cfcdee5e..70d487a9 100644 --- a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp +++ b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp @@ -44,6 +44,7 @@ #include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> #include <QtQuickTemplates2/private/qquickmenu_p.h> +#include <QtQuickTemplates2/private/qquickmenu_p_p.h> #include <QtQuickTemplates2/private/qquickmenubar_p.h> #include <QtQuickTemplates2/private/qquickmenubar_p_p.h> #include <QtQuickTemplates2/private/qquickmenubaritem_p.h> @@ -64,6 +65,7 @@ private slots: void mnemonics(); void addRemove(); void delegateFromSeparateComponent(); + void openTwice(); }; void tst_qquickmenubar::delegate() @@ -605,6 +607,64 @@ void tst_qquickmenubar::delegateFromSeparateComponent() QCOMPARE(menuBarItemBg->property("color").value<QColor>(), green); } +void tst_qquickmenubar::openTwice() +{ + if ((QGuiApplication::platformName() == QLatin1String("offscreen")) + || (QGuiApplication::platformName() == QLatin1String("minimal"))) + QSKIP("Mouse highlight not functional on offscreen/minimal platforms"); + + QQmlApplicationEngine engine(testFileUrl("menubar.qml")); + + QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(engine.rootObjects().value(0))); + QVERIFY(window); + QVERIFY(QTest::qWaitForWindowActive(window.data())); + + centerOnScreen(window.data()); + + QQuickMenuBar *menuBar = window->property("header").value<QQuickMenuBar *>(); + QVERIFY(menuBar); + + QQuickMenu *fileMenuBarMenu = menuBar->menuAt(0); + QVERIFY(fileMenuBarMenu); + + QQuickMenuBarItem *fileMenuBarItem = qobject_cast<QQuickMenuBarItem *>(fileMenuBarMenu->parentItem()); + QVERIFY(fileMenuBarItem); + QQuickMenuBarPrivate *menuBarPrivate = QQuickMenuBarPrivate::get(menuBar); + menuBar->polish(); + QVERIFY(menuBarPrivate->polishScheduled); + QTRY_VERIFY(!menuBarPrivate->polishScheduled); + + // Open a menu. + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + fileMenuBarItem->mapToScene(QPointF(fileMenuBarItem->width() / 2, fileMenuBarItem->height() / 2)).toPoint()); + QVERIFY(fileMenuBarItem->isHighlighted()); + QVERIFY(fileMenuBarMenu->isVisible()); + QTRY_VERIFY(fileMenuBarMenu->isOpened()); + waitForMenuListViewPolish(fileMenuBarMenu); + + // Click on an item to close the menu. + QQuickMenuItem *openMenuItem = qobject_cast<QQuickMenuItem *>(fileMenuBarMenu->itemAt(0)); + QVERIFY(openMenuItem); + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + openMenuItem->mapToScene(QPointF(openMenuItem->width() / 2, openMenuItem->height() / 2)).toPoint()); + QVERIFY(!fileMenuBarItem->isHighlighted()); + QTRY_VERIFY(!fileMenuBarMenu->isVisible()); + + // Re-open the menu. It should open with one click of the QQuickMenuBarItem. + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + fileMenuBarItem->mapToScene(QPointF(fileMenuBarItem->width() / 2, fileMenuBarItem->height() / 2)).toPoint()); + QVERIFY(fileMenuBarItem->isHighlighted()); + QVERIFY(fileMenuBarMenu->isVisible()); + QTRY_VERIFY(fileMenuBarMenu->isOpened()); + waitForMenuListViewPolish(fileMenuBarMenu); + + // Click on an item to close the menu. + QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, + openMenuItem->mapToScene(QPointF(openMenuItem->width() / 2, openMenuItem->height() / 2)).toPoint()); + QVERIFY(!fileMenuBarItem->isHighlighted()); + QTRY_VERIFY(!fileMenuBarMenu->isVisible()); +} + QTEST_QUICKCONTROLS_MAIN(tst_qquickmenubar) #include "tst_qquickmenubar.moc" |