--- D:/Downloads/qt-everywhere-opensource-src-5.5.0/qt-everywhere-opensource-src-5.5.0/qtquickcontrols/src/controls/qquickmenupopupwindow.cpp Mon Jun 29 23:03:02 2015 +++ D:/Develop/Libraries/Qt/5.5.0_vs2013/qtquickcontrols/src/controls/qquickmenupopupwindow.cpp Mon Oct 19 15:12:05 2015 @@ -122,8 +122,25 @@ void QQuickMenuPopupWindow::setGeometry(int posx, posx = qMax(posx, g.left()); } - posy = qBound(g.top(), posy, g.bottom() - h); + if (posy + h > g.bottom()) { + if (parentItem()) { + //Replace with https://codereview.qt-project.org/#/c/126574/ + //https://bugreports.qt.io/browse/QTBUG-28668 + QPoint quickWidgetOffset; + QQuickWindow *quickWindow = parentItem()->window(); + QWindow *renderWindow = QQuickRenderControl::renderWindowFor(quickWindow, &quickWidgetOffset); + QPointF pos = (renderWindow ? renderWindow : quickWindow)->mapToGlobal(quickWidgetOffset); + const QPointF mappedPos = QTransform::fromTranslate(pos.x(), pos.y()).map(parentItem()->mapToScene(QPointF())); + + posy = mappedPos.y() - h; + } else { + posy = g.bottom() - h; + } + } else { + posy = qMax(posy, g.top()); + } + QQuickWindow::setGeometry(posx, posy, w, h); emit geometryChanged(); }