summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/controls/qquickmenu.cpp2
-rw-r--r--src/controls/qquickmenupopupwindow.cpp11
-rw-r--r--src/controls/qquickmenupopupwindow_p.h7
-rw-r--r--tests/auto/menubar/data/WindowWithMenuBar.qml20
-rw-r--r--tests/auto/menubar/menubar.pro15
-rw-r--r--tests/auto/menubar/tst_menubar.cpp43
6 files changed, 91 insertions, 7 deletions
diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp
index 85bb44968..b55675236 100644
--- a/src/controls/qquickmenu.cpp
+++ b/src/controls/qquickmenu.cpp
@@ -421,7 +421,7 @@ void QQuickMenu::__popup(const QRectF &targetRect, int atItemIndex, MenuType men
m_platformMenu->setMenuType(QPlatformMenu::MenuType(menuType));
m_platformMenu->showPopup(parentWindow, globalTargetRect.toRect(), atItem ? atItem->platformItem() : 0);
} else {
- m_popupWindow = new QQuickMenuPopupWindow();
+ m_popupWindow = new QQuickMenuPopupWindow(this);
if (visualItem())
m_popupWindow->setParentItem(visualItem());
else
diff --git a/src/controls/qquickmenupopupwindow.cpp b/src/controls/qquickmenupopupwindow.cpp
index 520639799..f57199081 100644
--- a/src/controls/qquickmenupopupwindow.cpp
+++ b/src/controls/qquickmenupopupwindow.cpp
@@ -41,12 +41,14 @@
#include <qquickitem.h>
#include <QtGui/QScreen>
#include <QtQuick/QQuickRenderControl>
+#include "qquickmenu_p.h"
QT_BEGIN_NAMESPACE
-QQuickMenuPopupWindow::QQuickMenuPopupWindow() :
+QQuickMenuPopupWindow::QQuickMenuPopupWindow(QQuickMenu *menu) :
m_itemAt(0),
- m_logicalParentWindow(0)
+ m_logicalParentWindow(0),
+ m_menu(menu)
{
}
@@ -144,4 +146,9 @@ void QQuickMenuPopupWindow::exposeEvent(QExposeEvent *e)
QQuickPopupWindow::exposeEvent(e);
}
+QQuickMenu *QQuickMenuPopupWindow::menu() const
+{
+ return m_menu;
+}
+
QT_END_NAMESPACE
diff --git a/src/controls/qquickmenupopupwindow_p.h b/src/controls/qquickmenupopupwindow_p.h
index 3f8c29d15..517ba6a0d 100644
--- a/src/controls/qquickmenupopupwindow_p.h
+++ b/src/controls/qquickmenupopupwindow_p.h
@@ -41,11 +41,13 @@
QT_BEGIN_NAMESPACE
+class QQuickMenu;
+
class QQuickMenuPopupWindow : public QQuickPopupWindow
{
Q_OBJECT
public:
- QQuickMenuPopupWindow();
+ QQuickMenuPopupWindow(QQuickMenu *menu);
void setItemAt(QQuickItem *menuItem);
void setParentWindow(QWindow *effectiveParentWindow, QQuickWindow *parentWindow);
@@ -53,6 +55,8 @@ public:
void setParentItem(QQuickItem *);
+ QQuickMenu *menu() const;
+
protected Q_SLOTS:
void updateSize();
void updatePosition();
@@ -65,6 +69,7 @@ private:
QPointF m_oldItemPos;
QPointF m_initialPos;
QQuickWindow *m_logicalParentWindow;
+ QQuickMenu *m_menu;
};
QT_END_NAMESPACE
diff --git a/tests/auto/menubar/data/WindowWithMenuBar.qml b/tests/auto/menubar/data/WindowWithMenuBar.qml
index 1b6c6d932..f4caf3f35 100644
--- a/tests/auto/menubar/data/WindowWithMenuBar.qml
+++ b/tests/auto/menubar/data/WindowWithMenuBar.qml
@@ -99,4 +99,24 @@ ApplicationWindow {
width: 100
height: 20
}
+
+ Menu {
+ id: contextMenu
+ objectName: "contextMenu"
+ MenuItem {
+ id: contextMenuItem1
+ objectName: "contextMenuItem1"
+ text: "contextMenuItem1"
+ }
+ MenuItem {
+ id: contextMenuItem2
+ objectName: "contextMenuItem2"
+ text: "contextMenuItem2"
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: contextMenu.popup()
+ }
}
diff --git a/tests/auto/menubar/menubar.pro b/tests/auto/menubar/menubar.pro
index 45a2c995b..41a9eaacd 100644
--- a/tests/auto/menubar/menubar.pro
+++ b/tests/auto/menubar/menubar.pro
@@ -1,7 +1,16 @@
-CONFIG += testcase
+CONFIG += testcase console
TARGET = tst_menubar
-SOURCES += tst_menubar.cpp
+HEADERS += \
+ $$PWD/../../../src/controls/qquickpopupwindow_p.h \
+ $$PWD/../../../src/controls/qquickmenupopupwindow_p.h \
+ $$PWD/../../../src/controls/qquickmenubar_p.h
+
+SOURCES += \
+ tst_menubar.cpp \
+ $$PWD/../../../src/controls/qquickpopupwindow.cpp \
+ $$PWD/../../../src/controls/qquickmenupopupwindow.cpp \
+ $$PWD/../../../src/controls/qquickmenubar.cpp
include (../shared/util.pri)
@@ -11,6 +20,8 @@ win32:CONFIG+=insignificant_test # QTBUG-30513 - test is unstable
CONFIG += parallel_test
QT += core-private gui-private qml-private quick-private testlib
+INCLUDEPATH += $$PWD/../../../src/controls
+
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
OTHER_FILES += \
diff --git a/tests/auto/menubar/tst_menubar.cpp b/tests/auto/menubar/tst_menubar.cpp
index 1efef081e..1a25b07e1 100644
--- a/tests/auto/menubar/tst_menubar.cpp
+++ b/tests/auto/menubar/tst_menubar.cpp
@@ -42,6 +42,9 @@
#include <QtQml/QQmlApplicationEngine>
#include <QSignalSpy>
#include <QTest>
+#include "qquickmenupopupwindow_p.h"
+#include "qquickpopupwindow_p.h"
+#include "qquickmenu_p.h"
#define WAIT_TIME 500
@@ -59,7 +62,9 @@ private slots:
void init();
void cleanup();
- void testClickSubMenu();
+ void testClickSubMenu();
+ void testParentMenuForPopupsOutsideMenuBar();
+ void testParentMenuForPopupsInsideMenuBar();
private:
QQmlApplicationEngine* m_engine;
@@ -156,6 +161,42 @@ void tst_menubar::testClickSubMenu()
QCOMPARE(actionsSubMenu->property("__popupVisible").toBool(), false);
}
+void tst_menubar::testParentMenuForPopupsOutsideMenuBar()
+{
+ waitForRendering(m_window);
+ QCOMPARE(qApp->focusWindow() == m_window, true);
+ moveOnPos(m_window, QPointF(50,50));
+ clickOnPos(m_window, QPointF(50,50));
+ QTest::qWait(500);
+ QCOMPARE(qApp->focusWindow() == m_window, false);
+
+ QQuickMenuPopupWindow *window = dynamic_cast<QQuickMenuPopupWindow*>(qApp->focusWindow());
+ QVERIFY(window);
+
+ QObject *contextMenu = m_window->findChildren<QObject*>("contextMenu").first();
+ QVERIFY(contextMenu);
+
+ QCOMPARE(contextMenu, window->menu());
+}
+
+void tst_menubar::testParentMenuForPopupsInsideMenuBar()
+{
+ waitForRendering(m_window);
+ QCOMPARE(qApp->focusWindow() == m_window, true);
+ moveOnPos(m_window, QPointF(5,5));
+ clickOnPos(m_window, QPointF(5,5));
+ QTest::qWait(500);
+ QCOMPARE(qApp->focusWindow() == m_window, false);
+
+ QQuickMenuPopupWindow *window = dynamic_cast<QQuickMenuPopupWindow*>(qApp->focusWindow());
+ QVERIFY(window);
+
+ QObject *fileMenu = m_window->findChildren<QObject*>("fileMenu").first();
+ QVERIFY(fileMenu);
+
+ QCOMPARE(fileMenu, window->menu());
+}
+
QTEST_MAIN(tst_menubar)