summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-06-28 12:04:30 +0200
committerLaszlo Agocs <laszlo.agocs@digia.com>2014-07-01 10:25:58 +0200
commitdf295d70421f068a567d0e37784bf7a1def56073 (patch)
treeeff20b95fd529c76a8ab7e2c4db26a76fae5fa7b
parentce8e6301b4a80eebb081c8713fe8462bcc211351 (diff)
downloadqtquickcontrols-df295d70421f068a567d0e37784bf7a1def56073.tar.gz
Use the correct parent window for menu popups
The previous fix applied only to the non-platform menu case and was broken on OS X at least, when having a combobox in a QQuickWidget. Task-number: QTBUG-39908 Change-Id: I5dde103c2fe33d52a312cc80b36b47b13e72a188 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
-rw-r--r--src/controls/qquickmenu.cpp9
-rw-r--r--src/controls/qquickmenupopupwindow.cpp15
-rw-r--r--src/controls/qquickmenupopupwindow_p.h2
3 files changed, 16 insertions, 10 deletions
diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp
index c12060bf..3ae9b5e0 100644
--- a/src/controls/qquickmenu.cpp
+++ b/src/controls/qquickmenu.cpp
@@ -51,6 +51,7 @@
#include <QtGui/qpa/qplatformtheme.h>
#include <QtGui/qpa/qplatformmenu.h>
#include <qquickitem.h>
+#include <QtQuick/private/qquickrendercontrol_p.h>
QT_BEGIN_NAMESPACE
@@ -395,7 +396,11 @@ void QQuickMenu::__popup(qreal x, qreal y, int atItemIndex)
QQuickMenuBase *atItem = menuItemAtIndex(atItemIndex);
- QQuickWindow *parentWindow = findParentWindow();
+ QQuickWindow *quickWindow = findParentWindow();
+ QWindow *parentWindow = quickWindow;
+ QWindow *renderWindow = QQuickRenderControl::renderWindowFor(static_cast<QQuickWindow *>(parentWindow));
+ if (renderWindow)
+ parentWindow = renderWindow; // may not be a QQuickWindow anymore (happens when using QQuickWidget)
if (m_platformMenu) {
QPointF screenPosition(x + m_xOffset, y + m_yOffset);
@@ -410,7 +415,7 @@ void QQuickMenu::__popup(qreal x, qreal y, int atItemIndex)
if (visualItem())
m_popupWindow->setParentItem(visualItem());
else
- m_popupWindow->setParentWindow(parentWindow);
+ m_popupWindow->setParentWindow(parentWindow, quickWindow);
m_popupWindow->setPopupContentItem(m_menuContentItem);
m_popupWindow->setItemAt(atItem ? atItem->visualItem() : 0);
diff --git a/src/controls/qquickmenupopupwindow.cpp b/src/controls/qquickmenupopupwindow.cpp
index 6a2a03bc..c8483d63 100644
--- a/src/controls/qquickmenupopupwindow.cpp
+++ b/src/controls/qquickmenupopupwindow.cpp
@@ -64,8 +64,11 @@ void QQuickMenuPopupWindow::show()
void QQuickMenuPopupWindow::setParentItem(QQuickItem *item)
{
QQuickPopupWindow::setParentItem(item);
- if (item)
- setParentWindow(item->window());
+ if (item) {
+ QWindow *parentWindow = item->window();
+ QWindow *renderWindow = QQuickRenderControl::renderWindowFor(static_cast<QQuickWindow *>(parentWindow));
+ setParentWindow(renderWindow ? renderWindow : parentWindow, item->window());
+ }
}
void QQuickMenuPopupWindow::setItemAt(QQuickItem *menuItem)
@@ -83,12 +86,10 @@ void QQuickMenuPopupWindow::setItemAt(QQuickItem *menuItem)
}
}
-void QQuickMenuPopupWindow::setParentWindow(QQuickWindow *parentWindow)
+void QQuickMenuPopupWindow::setParentWindow(QWindow *effectiveParentWindow, QQuickWindow *parentWindow)
{
- QWindow *proxyWindow = QQuickRenderControl::renderWindowFor(parentWindow);
- QWindow *renderWindow = proxyWindow ? proxyWindow : parentWindow;
- if (transientParent() != renderWindow)
- setTransientParent(renderWindow);
+ if (transientParent() != effectiveParentWindow)
+ setTransientParent(effectiveParentWindow);
if (parentWindow) {
connect(parentWindow, SIGNAL(destroyed()), this, SLOT(dismissPopup()));
if (QQuickMenuPopupWindow *pw = qobject_cast<QQuickMenuPopupWindow *>(parentWindow))
diff --git a/src/controls/qquickmenupopupwindow_p.h b/src/controls/qquickmenupopupwindow_p.h
index 1e824bea..a550daa2 100644
--- a/src/controls/qquickmenupopupwindow_p.h
+++ b/src/controls/qquickmenupopupwindow_p.h
@@ -53,7 +53,7 @@ public:
QQuickMenuPopupWindow();
void setItemAt(QQuickItem *menuItem);
- void setParentWindow(QQuickWindow *parentWindow);
+ void setParentWindow(QWindow *effectiveParentWindow, QQuickWindow *parentWindow);
void setGeometry(int posx, int posy, int w, int h);
void setParentItem(QQuickItem *);